# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/compiled_action.gni")
import("//build/host.gni")
import("//build/rust/rustc_binary.gni")
import("//build/rust/rustc_test.gni")
import("//build/testing/golden_test.gni")
import("//tools/fidl/fidlc/testdata/info.gni")

if (is_host) {
  common_sources = [
    "src/fidljson.rs",
    "src/main.rs",
    "src/templates/markdown/mod.rs",
    "src/templates/mod.rs",
  ]

  common_inputs = [
    "src/templates/markdown/partials/header.hbs",
    "src/templates/markdown/partials/types/filename.hbs",
    "src/templates/markdown/interface.hbs",
    "src/templates/markdown/partials/header_dir.hbs",
    "src/templates/markdown/partials/declarations/tables.hbs",
    "src/templates/markdown/partials/declarations/enums.hbs",
    "src/templates/markdown/partials/types/vector.hbs",
    "src/templates/markdown/partials/declarations/constants.hbs",
    "src/templates/markdown/partials/declarations/type_aliases.hbs",
    "src/templates/markdown/partials/declarations/protocols.hbs",
    "src/templates/markdown/partials/types/doc.hbs",
    "src/templates/markdown/partials/declarations/bits.hbs",
    "src/templates/markdown/partials/declarations/unions.hbs",
    "src/templates/markdown/main.hbs",
    "src/templates/markdown/toc.hbs",
    "src/templates/markdown/partials/types/type.hbs",
    "src/templates/markdown/partials/declarations/structs.hbs",
    "src/templates/markdown/style.css",
  ]

  rustc_binary("fidldoc_bin") {
    name = "fidldoc"
    edition = "2018"
    deps = [ ":rust_crates" ]
    sources = common_sources
    inputs = common_inputs
  }

  copy("fidldoc_copy_config") {
    sources = [ "src/fidldoc.config.json" ]
    outputs = [ "${host_tools_dir}/fidldoc.config.json" ]
  }

  rustc_test("fidldoc_bin_test") {
    source_root = "src/main.rs"
    deps = [
      ":fidldoc_bin",
      ":rust_crates",
    ]
    sources = common_sources
    inputs = common_inputs + [
               "src/templates/markdown/testdata/README.md",
               "src/templates/markdown/testdata/_toc.yaml",
               "src/fidldoc.config.json",
             ]
  }

  group("rust_crates") {
    deps = [
      "//third_party/rust_crates:anyhow",
      "//third_party/rust_crates:argh",
      "//third_party/rust_crates:glob",
      "//third_party/rust_crates:handlebars",
      "//third_party/rust_crates:heck",
      "//third_party/rust_crates:lazy_static",
      "//third_party/rust_crates:log",
      "//third_party/rust_crates:pulldown-cmark",
      "//third_party/rust_crates:rayon",
      "//third_party/rust_crates:regex",
      "//third_party/rust_crates:serde",
      "//third_party/rust_crates:serde_json",
      "//third_party/rust_crates:simplelog",
      "//third_party/rust_crates:tempfile",
    ]
  }

  fidl_testdata_info_filtered = []
  foreach(info, fidl_testdata_info) {
    if (info.denylist + [ "fidldoc" ] - [ "fidldoc" ] == info.denylist) {
      fidl_testdata_info_filtered += [ info ]
    }
  }

  compiled_action("generate_goldens") {
    testonly = true
    tool = ":fidldoc_bin"
    tool_output_name = "fidldoc"
    deps = [ ":fidldoc_copy_config" ]
    sources = []
    inputs = [ "${host_tools_dir}/fidldoc.config.json" ]
    args = [
      "--silent",
      "--config",
      rebase_path("${host_tools_dir}/fidldoc.config.json", root_build_dir),
      "--out",
      rebase_path("${target_gen_dir}/goldens", root_build_dir),
    ]
    outputs = [
      "$target_gen_dir/goldens/_toc.yaml",
      "$target_gen_dir/goldens/README.md",
      "$target_gen_dir/goldens/style.css",
    ]
    foreach(info, fidl_testdata_info_filtered) {
      deps += [ "${info.target}($fidl_toolchain)" ]
      json_ir = "${info.fidl_gen_dir}/${info.target_name}.fidl.json"
      sources += [ json_ir ]
      args += [ rebase_path(json_ir, root_build_dir) ]
      outputs += [ "$target_gen_dir/goldens/${info.library}/README.md" ]
    }
  }

  golden_test("fidldoc_golden_tests") {
    goldens_dir = "goldens"
    deps = [ ":generate_goldens" ]
    entries = [
      {
        golden = "_toc.yaml.golden"
        generated = "$target_gen_dir/goldens/_toc.yaml"
      },
      {
        golden = "README.md.golden"
        generated = "$target_gen_dir/goldens/README.md"
      },
      {
        golden = "style.css.golden"
        generated = "$target_gen_dir/goldens/style.css"
      },
    ]
    foreach(info, fidl_testdata_info_filtered) {
      entries += [
        {
          golden = "${info.name}.md.golden"
          generated = "$target_gen_dir/goldens/${info.library}/README.md"
        },
      ]
    }
  }
}

install_host_tools("fidldoc") {
  deps = [
    ":fidldoc_bin($host_toolchain)",
    ":fidldoc_copy_config($host_toolchain)",
  ]
  outputs = [ "fidldoc" ]
}

group("tests") {
  testonly = true
  deps = [
    ":fidldoc_bin_test($host_toolchain)",
    ":fidldoc_golden_tests($host_toolchain)",
  ]
}
