load("@build_bazel_rules_nodejs//:providers.bzl", "JSModuleInfo")
load("@npm//@bazel/rollup:index.bzl", upstream_rollup_bundle = "rollup_bundle")
load("@npm//@bazel/terser:index.bzl", "terser_minified")
load("@bazel_skylib//lib:paths.bzl", "paths")
load("@npm//@bazel/protractor:index.bzl", "protractor_web_test_suite")
load("@npm//@bazel/typescript:index.bzl", "ts_project")

def rollup_bundle(name, deps, visibility = None, **kwargs):
    """Calls the upstream rollup_bundle() and exposes a .min.js file.

    Legacy version of rollup_bundle() used to provide the .min.js file. This
    wrapper provides the same interface by explicitly exposing a .min.js file.
    """
    upstream_rollup_bundle(
        name = name,
        visibility = visibility,
        deps = deps + [
            "@npm//@rollup/plugin-node-resolve",
        ],
        config_file = "//:rollup.config.js",
        link_workspace_root = True,
        **kwargs
    )

    terser_minified(
        name = name + "__min",
        src = name + ".js",
    )

    # Copy the __min.js file (a declared output inside the rule) so that it's a
    # pre-declared output and publicly visible. I.e. via attr.output() below.
    _expose_minified_js(
        name = name + "__min_exposed",
        src = ":%s__min" % name,
        out = name + ".min.js",
        visibility = visibility,
    )

def _expose_minified_js_impl(ctx):
    """Copies the .min.js file in order to make it publicly accessible."""
    sources = ctx.attr.src[JSModuleInfo].sources.to_list()
    min_js = None
    for src in sources:
        if src.basename.endswith("__min.js"):
            min_js = src
            break

    if min_js == None:
        fail("Couldn't find .min.js in " + str(ctx.attr.src))

    ctx.actions.run(
        inputs = [min_js],
        outputs = [ctx.outputs.out],
        executable = "cp",
        arguments = [min_js.path, ctx.outputs.out.path],
    )

_expose_minified_js = rule(
    implementation = _expose_minified_js_impl,
    attrs = {
        "src": attr.label(providers = [JSModuleInfo]),
        "out": attr.output(mandatory = True),
    },
)

def protractor_ts_test(name, srcs, deps = None, data = None, **kwargs):
    """Wraps upstream protractor_web_test_suite() to reduce boilerplate.

    This is largely based on the upstream protractor example:
    https://github.com/bazelbuild/rules_nodejs/blob/stable/examples/angular/e2e/BUILD.bazel

    See the documentation for more information:
    https://bazelbuild.github.io/rules_nodejs/Protractor.html#protractor_web_test_suite
    """
    ts_project(
        name = name + "__lib",
        srcs = srcs,
        testonly = 1,
        deps = (deps or []) + [
            # Implicit deps that are necessary to get tests of this kind to
            # work.
            "@npm//@types/jasmine",
            "@npm//jasmine",
            "@npm//protractor",
            "@npm//@types/node",
        ],
        tsconfig = {},
        declaration = True,
        declaration_map = True,
    )

    data = (data or []) + [
        "//tools/build_rules/js/waitpid_module",
    ]

    protractor_web_test_suite(
        name = name,
        srcs = [paths.replace_extension(src, ".js") for src in srcs],
        deps = [":%s__lib" % name],
        data = data,
        **kwargs
    )
