def documentation_attributes():
  return [
    "toc",
    '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.action(
    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.action(
    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.action(
    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.action(
    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,
    )
