"""This module defines the karma_test rule."""

load("@infra-sk_npm//@bazel/typescript:index.bzl", "ts_library")
load("@infra-sk_npm//@bazel/rollup:index.bzl", "rollup_bundle")
load("@infra-sk_npm//karma:index.bzl", _generated_karma_test = "karma_test")

def karma_test(name, srcs, deps, entry_point = None):
    """Runs unit tests in a browser with Karma and the Mocha test runner.

    When executed with `bazel test`, a headless Chrome browser will be used. This supports testing
    multiple karma_test targets in parallel, and works on RBE.

    When executed with `bazel run`, it prints out a URL to stdout that can be opened in the browser,
    e.g. to debug the tests using the browser's developer tools. Source maps are generated.

    When executed with `ibazel test`, the test runner never exits, and tests will be rerun every
    time a source file is changed.

    When executed with `ibazel run`, it will act the same way as `bazel run`, but the tests will be
    rebuilt automatically when a source file changes. Reload the browser page to see the changes.

    Args:
      name: The name of the target.
      srcs: The *.ts test files.
      deps: The ts_library dependencies for the source files.
      entry_point: File in srcs to be used as the entry point to generate the JS bundle executed by
        the test runner. Optional if srcs contains only one file.
    """

    if len(srcs) > 1 and not entry_point:
        fail("An entry_point must be specified when srcs contains more than one file.")

    if entry_point and entry_point not in srcs:
        fail("The entry_point must be included in srcs.")

    if len(srcs) == 1:
        entry_point = srcs[0]

    ts_library(
        name = name + "_lib",
        srcs = srcs,
        deps = deps + [
            # Add common test dependencies for convenience.
            "@infra-sk_npm//@types/mocha",
            "@infra-sk_npm//@types/chai",
            "@infra-sk_npm//@types/sinon",
        ],
    )

    rollup_bundle(
        name = name + "_bundle",
        entry_point = entry_point,
        deps = [
            name + "_lib",
            "@infra-sk_npm//@rollup/plugin-node-resolve",
            "@infra-sk_npm//@rollup/plugin-commonjs",
            "@infra-sk_npm//rollup-plugin-sourcemaps",
        ],
        format = "umd",
        config_file = "//infra-sk:rollup.config.js",
    )

    # This rule is automatically generated by rules_nodejs from Karma's package.json file.
    _generated_karma_test(
        name = name,
        size = "large",
        data = [
            name + "_bundle",
            "//infra-sk/karma_test:karma.conf.js",
            "@infra-sk_npm//karma-chrome-launcher",
            "@infra-sk_npm//karma-sinon",
            "@infra-sk_npm//karma-mocha",
            "@infra-sk_npm//karma-chai",
            "@infra-sk_npm//karma-chai-dom",
            "@infra-sk_npm//karma-spec-reporter",
            "@infra-sk_npm//mocha",
        ],
        templated_args = [
            "start",
            "$(execpath //infra-sk/karma_test:karma.conf.js)",
            "$$(rlocation $(location %s_bundle))" % name,
        ],
        tags = [
            # Necessary for it to work with ibazel.
            "ibazel_notify_changes",
        ],
    )
