"""Re-export of some bazel rules with repository-wide defaults."""
load("@build_bazel_rules_nodejs//:defs.bzl", _npm_package = "npm_package")
load("@build_bazel_rules_typescript//:defs.bzl", _ts_library = "ts_library", _ts_web_test_suite = "ts_web_test_suite")
load("//packages/bazel:index.bzl", _ng_module = "ng_module", _ng_package = "ng_package")
load("//packages/bazel/src:ng_module.bzl", _internal_global_ng_module = "internal_global_ng_module")

DEFAULT_TSCONFIG = "//packages:tsconfig-build.json"
DEFAULT_NODE_MODULES = "@angular_deps//:node_modules"

# Packages which are versioned together on npm
ANGULAR_SCOPED_PACKAGES = ["@angular/%s" % p for p in [
  # core should be the first package because it's the main package in the group
  # this is significant for Angular CLI and "ng update" specifically, @angular/core
  # is considered the identifier of the group by these tools.
  "core",
  "bazel",
  "common",
  "compiler",
  "compiler-cli",
  "animations",
  "elements",
  "platform-browser",
  "platform-browser-dynamic",
  "forms",
  "http",
  "platform-server",
  "platform-webworker",
  "platform-webworker-dynamic",
  "upgrade",
  "router",
  "language-service",
  "service-worker",
]]

PKG_GROUP_REPLACEMENTS = {
    "\"NG_UPDATE_PACKAGE_GROUP\"": """[
      %s
    ]""" % ",\n      ".join(["\"%s\"" % s for s in ANGULAR_SCOPED_PACKAGES])
}

def ts_library(tsconfig = None, node_modules = DEFAULT_NODE_MODULES, **kwargs):
  if not tsconfig:
    tsconfig = DEFAULT_TSCONFIG
  _ts_library(tsconfig = tsconfig, node_modules = node_modules, **kwargs)

def ng_module(name, tsconfig = None, entry_point = None, node_modules = DEFAULT_NODE_MODULES, **kwargs):
  if not tsconfig:
    tsconfig = DEFAULT_TSCONFIG
  if not entry_point:
    entry_point = "public_api.ts"
  _ng_module(name = name, flat_module_out_file = name, tsconfig = tsconfig, entry_point = entry_point, node_modules = node_modules, **kwargs)

# ivy_ng_module behaves like ng_module, and under --define=compile=legacy it runs ngc with global
# analysis but produces Ivy outputs. Under other compile modes, it behaves as ng_module.
# TODO(alxhub): remove when ngtsc supports the same use cases.
def ivy_ng_module(name, tsconfig = None, entry_point = None, **kwargs):
  if not tsconfig:
    tsconfig = DEFAULT_TSCONFIG
  if not entry_point:
    entry_point = "public_api.ts"
  _internal_global_ng_module(name = name, flat_module_out_file = name, tsconfig = tsconfig, entry_point = entry_point, **kwargs)

def ng_package(name, readme_md = None, license_banner = None, **kwargs):
  if not readme_md:
    readme_md = "//packages:README.md"
  if not license_banner:
    license_banner = "//packages:license-banner.txt"

  _ng_package(
      name = name,
      readme_md = readme_md,
      license_banner = license_banner,
      replacements = PKG_GROUP_REPLACEMENTS,
      **kwargs)

def npm_package(name, replacements = {}, **kwargs):
  _npm_package(
      name = name,
      replacements = dict(replacements, **PKG_GROUP_REPLACEMENTS),
      **kwargs)

def ts_web_test_suite(bootstrap = [], deps = [], **kwargs):
  if not bootstrap:
    bootstrap = ["//:web_test_bootstrap_scripts"]
  local_deps = [
    "@angular_deps//:node_modules/tslib/tslib.js",
    "//tools/testing:browser",
  ] + deps

  _ts_web_test_suite(
      bootstrap = bootstrap,
      deps = local_deps,
      # Run unit tests on local Chromium by default.
      # You can exclude tests based on tags, e.g. to skip Firefox testing,
      #   `bazel test --test_tag_filters=-browser:firefox-local [targets]`
      browsers = [
          "@io_bazel_rules_webtesting//browsers:chromium-local",
          # Don't test on local Firefox by default, for faster builds.
          # We think that bugs in Angular tend to be caught the same in any
          # evergreen browser.
          # "@io_bazel_rules_webtesting//browsers:firefox-local",
          # TODO(alexeagle): add remote browsers on SauceLabs
      ],
      **kwargs)
