def documentation_attributes():
  return [
    "toc2",
    'newline="\\n"',
    'asterisk="&#42;"',
    'plus="&#43;"',
    'caret="&#94;"',
    'startsb="&#91;"',
    'endsb="&#93;"',
    'tilde="&#126;"',
    "last-update-label!",
    "source-highlighter=prettify",
    "stylesheet=DEFAULT",
    "linkcss=true",
    "prettifydir=.",
    # Just a placeholder, will be filled in asciidoctor java binary:
    "revnumber=%s",
  ]

def release_notes_attributes():
  return [
    'toc',
    'newline="\\n"',
    'asterisk="&#42;"',
    'plus="&#43;"',
    'caret="&#94;"',
    'startsb="&#91;"',
    'endsb="&#93;"',
    'tilde="&#126;"',
    'last-update-label!',
    'stylesheet=DEFAULT',
    'linkcss=true',
  ]

def _replace_macros_impl(ctx):
  cmd = [
    ctx.file._exe.path,
    '--suffix', ctx.attr.suffix,
    "-s", ctx.file.src.path,
    "-o", ctx.outputs.out.path,
  ]
  if ctx.attr.searchbox:
    cmd.append('--searchbox')
  else:
    cmd.append('--no-searchbox')
  ctx.actions.run_shell(
    inputs = [ctx.file._exe, ctx.file.src],
    outputs = [ctx.outputs.out],
    command = cmd,
    use_default_shell_env = True,
    progress_message = "Replacing macros in %s" % ctx.file.src.short_path,
  )

_replace_macros = rule(
    attrs = {
        "_exe": attr.label(
            default = Label("//Documentation:replace_macros.py"),
            allow_single_file = True,
        ),
        "src": attr.label(
            mandatory = True,
            allow_single_file = [".txt"],
        ),
        "suffix": attr.string(mandatory = True),
        "searchbox": attr.bool(default = True),
        "out": attr.output(mandatory = True),
    },
    implementation = _replace_macros_impl,
)

def _generate_asciidoc_args(ctx):
  args = []
  if ctx.attr.backend:
    args.extend(["-b", ctx.attr.backend])
  revnumber = False
  for attribute in ctx.attr.attributes:
    if attribute.startswith("revnumber="):
      revnumber = True
    else:
      args.extend(["-a", attribute])
  if revnumber:
    args.extend([
      "--revnumber-file", ctx.file.version.path,
    ])
  for src in ctx.files.srcs:
    args.append(src.path)
  return args

def _invoke_replace_macros(name, src, suffix, searchbox):
  fn = src
  if fn.startswith(":"):
    fn = src[1:]

  _replace_macros(
    name = "macros_%s_%s" % (name, fn),
    src = src,
    out = fn + suffix,
    suffix = suffix,
    searchbox = searchbox,
  )

  return ":" + fn + suffix, fn.replace(".txt", ".html")

def _asciidoc_impl(ctx):
  args = [
    "--bazel",
    "--in-ext", ".txt" + ctx.attr.suffix,
    "--out-ext", ".html",
  ]
  args.extend(_generate_asciidoc_args(ctx))
  ctx.actions.run(
    inputs = ctx.files.srcs + [ctx.executable._exe, ctx.file.version],
    outputs = ctx.outputs.outs,
    executable = ctx.executable._exe,
    arguments = args,
    progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
  )

_asciidoc_attrs = {
    "_exe": attr.label(
        default = Label("//lib/asciidoctor:asciidoc"),
        cfg = "host",
        allow_files = True,
        executable = True,
    ),
    "srcs": attr.label_list(
        mandatory = True,
        allow_files = True,
    ),
    "version": attr.label(
        default = Label("//:version.txt"),
        allow_single_file = True,
    ),
    "suffix": attr.string(mandatory = True),
    "backend": attr.string(),
    "attributes": attr.string_list(),
}

_asciidoc = rule(
    attrs = dict(_asciidoc_attrs.items() + {
        "outs": attr.output_list(mandatory = True),
    }.items()),
    implementation = _asciidoc_impl,
)

def _genasciidoc_htmlonly(
    name,
    srcs = [],
    attributes = [],
    backend = None,
    searchbox = True,
    **kwargs):
  SUFFIX = "." + name + "_macros"
  new_srcs = []
  outs = ["asciidoctor.css"]

  for src in srcs:
    new_src, html_name = _invoke_replace_macros(name, src, SUFFIX, searchbox)
    new_srcs.append(new_src)
    outs.append(html_name)

  _asciidoc(
    name = name + "_gen",
    srcs = new_srcs,
    suffix = SUFFIX,
    backend = backend,
    attributes = attributes,
    outs = outs,
  )

  native.filegroup(
    name = name,
    data = outs,
    **kwargs
  )

def genasciidoc(
    name,
    srcs = [],
    attributes = [],
    backend = None,
    searchbox = True,
    resources = True,
    **kwargs):
  SUFFIX = "_htmlonly"

  _genasciidoc_htmlonly(
    name = name + SUFFIX if resources else name,
    srcs = srcs,
    attributes = attributes,
    backend = backend,
    searchbox = searchbox,
    **kwargs
  )

  if resources:
    htmlonly = ":" + name + SUFFIX
    native.filegroup(
      name = name,
      srcs = [
        htmlonly,
        "//Documentation:resources",
      ],
      **kwargs
    )

def _asciidoc_html_zip_impl(ctx):
  args = [
    "--mktmp",
    "-z", ctx.outputs.out.path,
    "--in-ext", ".txt" + ctx.attr.suffix,
    "--out-ext", ".html",
  ]
  args.extend(_generate_asciidoc_args(ctx))
  ctx.actions.run(
    inputs = ctx.files.srcs + [ctx.executable._exe, ctx.file.version],
    outputs = [ctx.outputs.out],
    executable = ctx.executable._exe,
    arguments = args,
    progress_message = "Rendering asciidoctor files for %s" % ctx.label.name,
  )

_asciidoc_html_zip = rule(
    attrs = _asciidoc_attrs,
    outputs = {
        "out": "%{name}.zip",
    },
    implementation = _asciidoc_html_zip_impl,
)

def _genasciidoc_htmlonly_zip(
    name,
    srcs = [],
    attributes = [],
    backend = None,
    searchbox = True,
    **kwargs):
  SUFFIX = "." + name + "_expn"
  new_srcs = []

  for src in srcs:
    new_src, _ = _invoke_replace_macros(name, src, SUFFIX, searchbox)
    new_srcs.append(new_src)

  _asciidoc_html_zip(
    name = name,
    srcs = new_srcs,
    suffix = SUFFIX,
    backend = backend,
    attributes = attributes,
  )

def _asciidoc_zip_impl(ctx):
  tmpdir = ctx.outputs.out.path + "_tmpdir"
  cmd = [
    "p=$PWD",
    "rm -rf %s" % tmpdir,
    "mkdir -p %s/%s/" % (tmpdir, ctx.attr.directory),
    "unzip -q %s -d %s/%s/" % (ctx.file.src.path, tmpdir, ctx.attr.directory),
  ]
  for r in ctx.files.resources:
    if r.path == r.short_path:
      cmd.append("tar -cf- %s | tar -C %s -xf-" % (r.short_path, tmpdir))
    else:
      parent = r.path[:-len(r.short_path)]
      cmd.append(
        "tar -C %s -cf- %s | tar -C %s -xf-" % (parent, r.short_path, tmpdir))
  cmd.extend([
    "cd %s" % tmpdir,
    "zip -qr $p/%s *" % ctx.outputs.out.path,
  ])
  ctx.actions.run_shell(
    inputs = [ctx.file.src] + ctx.files.resources,
    outputs = [ctx.outputs.out],
    command = " && ".join(cmd),
    progress_message =
        "Generating asciidoctor zip file %s" % ctx.outputs.out.short_path,
  )

_asciidoc_zip = rule(
    attrs = {
        "src": attr.label(
            mandatory = True,
            allow_single_file = [".zip"],
        ),
        "resources": attr.label_list(
            mandatory = True,
            allow_files = True,
        ),
        "directory": attr.string(mandatory = True),
    },
    outputs = {
        "out": "%{name}.zip",
    },
    implementation = _asciidoc_zip_impl,
)

def genasciidoc_zip(
    name,
    srcs = [],
    attributes = [],
    directory = None,
    backend = None,
    searchbox = True,
    resources = True,
    **kwargs):
  SUFFIX = "_htmlonly"

  _genasciidoc_htmlonly_zip(
    name = name + SUFFIX if resources else name,
    srcs = srcs,
    attributes = attributes,
    backend = backend,
    searchbox = searchbox,
    **kwargs
  )

  if resources:
    htmlonly = ":" + name + SUFFIX
    _asciidoc_zip(
      name = name,
      src = htmlonly,
      resources = ["//Documentation:resources"],
      directory = directory,
    )
