load("@aspect_bazel_lib//lib:copy_to_bin.bzl", "copy_to_bin")
load("@aspect_bazel_lib//lib:write_source_files.bzl", "write_source_files")
load("@aspect_rules_esbuild//esbuild:defs.bzl", "esbuild")
load("@aspect_rules_js//npm:defs.bzl", "npm_package")
load("@npm//:defs.bzl", "npm_link_all_packages")
load("@npm//:test262-harness/package_json.bzl", test262_harness_bin = "bin")
load("//tools:index.bzl", "bundle_karma_tests", "generate_src_file", "package_json_test", "ts_compile", "ts_script")
load("//tools:jest.bzl", "jest_test")

npm_link_all_packages()

PACKAGE_NAME = "intl-relativetimeformat"

TEST_LOCALES = [
    "en",
    "en-AI",
    "zh",
    "zh-Hant",
    "zh-Hans",
]

TEST_LOCALE_DATA = ["tests/locale-data/%s.json" % locale for locale in TEST_LOCALES]

npm_package(
    name = "pkg",
    srcs = [
        "LICENSE.md",
        "README.md",
        "package.json",
        ":dist",
        ":locale-data",
        # polyfill-library uses this
        "polyfill.iife.js",
    ],
    package = "@formatjs/%s" % PACKAGE_NAME,
    visibility = ["//visibility:public"],
)

SRCS = glob(
    [
        "*.ts",
        "abstract/*.ts",
    ],
    exclude = ["test*.*"],
)

TESTS = glob([
    "tests/*.test.ts",
    "tests/__snapshots__/*.snap",
])

SRC_DEPS = [
    ":node_modules/@formatjs/ecma402-abstract",
    ":node_modules/@formatjs/intl-localematcher",
]

ts_compile(
    name = "dist",
    srcs = [":srcs"],
    skip_esm = False,
    deps = SRC_DEPS,
)

jest_test(
    name = "unit_test",
    data = [":srcs"] + TESTS + TEST_LOCALE_DATA + SRC_DEPS + [
        ":node_modules/@formatjs/intl-getcanonicallocales",
        ":node_modules/@formatjs/intl-locale",
        ":node_modules/@formatjs/intl-pluralrules",
    ],
)

# CLDR
ALL_LOCALES = [
    "af",
    "af-NA",
    "agq",
    "ak",
    "am",
    "ar",
    "ar-AE",
    "ar-BH",
    "ar-DJ",
    "ar-DZ",
    "ar-EG",
    "ar-EH",
    "ar-ER",
    "ar-IL",
    "ar-IQ",
    "ar-JO",
    "ar-KM",
    "ar-KW",
    "ar-LB",
    "ar-LY",
    "ar-MA",
    "ar-MR",
    "ar-OM",
    "ar-PS",
    "ar-QA",
    "ar-SA",
    "ar-SD",
    "ar-SO",
    "ar-SS",
    "ar-SY",
    "ar-TD",
    "ar-TN",
    "ar-YE",
    "as",
    "asa",
    "ast",
    "az",
    "az-Cyrl",
    "az-Latn",
    "bas",
    "be",
    "be-tarask",
    "bem",
    "bez",
    "bg",
    "bm",
    "bn",
    "bn-IN",
    "bo",
    "bo-IN",
    "br",
    "brx",
    "bs",
    "bs-Cyrl",
    "bs-Latn",
    "ca",
    "ca-AD",
    "ca-ES-valencia",
    "ca-FR",
    "ca-IT",
    "ccp",
    "ccp-IN",
    "ce",
    "ceb",
    "cgg",
    "chr",
    "ckb",
    "ckb-IR",
    "cs",
    "cy",
    "da",
    "da-GL",
    "dav",
    "de",
    "de-AT",
    "de-BE",
    "de-CH",
    "de-IT",
    "de-LI",
    "de-LU",
    "dje",
    "doi",
    "dsb",
    "dua",
    "dyo",
    "dz",
    "ebu",
    "ee",
    "ee-TG",
    "el",
    "el-CY",
    "en",
    "en-001",
    "en-150",
    "en-AE",
    "en-AG",
    "en-AI",
    "en-AS",
    "en-AT",
    "en-AU",
    "en-BB",
    "en-BE",
    "en-BI",
    "en-BM",
    "en-BS",
    "en-BW",
    "en-BZ",
    "en-CA",
    "en-CC",
    "en-CH",
    "en-CK",
    "en-CM",
    "en-CX",
    "en-CY",
    "en-DE",
    "en-DG",
    "en-DK",
    "en-DM",
    "en-ER",
    "en-FI",
    "en-FJ",
    "en-FK",
    "en-FM",
    "en-GB",
    "en-GD",
    "en-GG",
    "en-GH",
    "en-GI",
    "en-GM",
    "en-GU",
    "en-GY",
    "en-HK",
    "en-IE",
    "en-IL",
    "en-IM",
    "en-IN",
    "en-IO",
    "en-JE",
    "en-JM",
    "en-KE",
    "en-KI",
    "en-KN",
    "en-KY",
    "en-LC",
    "en-LR",
    "en-LS",
    "en-MG",
    "en-MH",
    "en-MO",
    "en-MP",
    "en-MS",
    "en-MT",
    "en-MU",
    "en-MW",
    "en-MY",
    "en-NA",
    "en-NF",
    "en-NG",
    "en-NL",
    "en-NR",
    "en-NU",
    "en-NZ",
    "en-PG",
    "en-PH",
    "en-PK",
    "en-PN",
    "en-PR",
    "en-PW",
    "en-RW",
    "en-SB",
    "en-SC",
    "en-SD",
    "en-SE",
    "en-SG",
    "en-SH",
    "en-SI",
    "en-SL",
    "en-SS",
    "en-SX",
    "en-SZ",
    "en-TC",
    "en-TK",
    "en-TO",
    "en-TT",
    "en-TV",
    "en-TZ",
    "en-UG",
    "en-UM",
    "en-VC",
    "en-VG",
    "en-VI",
    "en-VU",
    "en-WS",
    "en-ZA",
    "en-ZM",
    "en-ZW",
    "eo",
    "es",
    "es-419",
    "es-AR",
    "es-BO",
    "es-BR",
    "es-BZ",
    "es-CL",
    "es-CO",
    "es-CR",
    "es-CU",
    "es-DO",
    "es-EA",
    "es-EC",
    "es-GQ",
    "es-GT",
    "es-HN",
    "es-IC",
    "es-MX",
    "es-NI",
    "es-PA",
    "es-PE",
    "es-PH",
    "es-PR",
    "es-PY",
    "es-SV",
    "es-US",
    "es-UY",
    "es-VE",
    "et",
    "eu",
    "ewo",
    "fa",
    "fa-AF",
    "ff",
    "ff-Adlm",
    "ff-Adlm-BF",
    "ff-Adlm-CM",
    "ff-Adlm-GH",
    "ff-Adlm-GM",
    "ff-Adlm-GW",
    "ff-Adlm-LR",
    "ff-Adlm-MR",
    "ff-Adlm-NE",
    "ff-Adlm-NG",
    "ff-Adlm-SL",
    "ff-Adlm-SN",
    "ff-Latn",
    "ff-Latn-BF",
    "ff-Latn-CM",
    "ff-Latn-GH",
    "ff-Latn-GM",
    "ff-Latn-GN",
    "ff-Latn-GW",
    "ff-Latn-LR",
    "ff-Latn-MR",
    "ff-Latn-NE",
    "ff-Latn-NG",
    "ff-Latn-SL",
    "fi",
    "fil",
    "fo",
    "fo-DK",
    "fr",
    "fr-BE",
    "fr-BF",
    "fr-BI",
    "fr-BJ",
    "fr-BL",
    "fr-CA",
    "fr-CD",
    "fr-CF",
    "fr-CG",
    "fr-CH",
    "fr-CI",
    "fr-CM",
    "fr-DJ",
    "fr-DZ",
    "fr-GA",
    "fr-GF",
    "fr-GN",
    "fr-GP",
    "fr-GQ",
    "fr-HT",
    "fr-KM",
    "fr-LU",
    "fr-MA",
    "fr-MC",
    "fr-MF",
    "fr-MG",
    "fr-ML",
    "fr-MQ",
    "fr-MR",
    "fr-MU",
    "fr-NC",
    "fr-NE",
    "fr-PF",
    "fr-PM",
    "fr-RE",
    "fr-RW",
    "fr-SC",
    "fr-SN",
    "fr-SY",
    "fr-TD",
    "fr-TG",
    "fr-TN",
    "fr-VU",
    "fr-WF",
    "fr-YT",
    "fur",
    "fy",
    "ga",
    "ga-GB",
    "gd",
    "gl",
    "gsw",
    "gsw-FR",
    "gsw-LI",
    "gu",
    "guz",
    "gv",
    "ha",
    "ha-GH",
    "ha-NE",
    "haw",
    "he",
    "hi",
    "hr",
    "hr-BA",
    "hsb",
    "hu",
    "hy",
    "ia",
    "id",
    "ig",
    "ii",
    "is",
    "it",
    "it-CH",
    "it-SM",
    "it-VA",
    "ja",
    "jgo",
    "jmc",
    "jv",
    "ka",
    "kab",
    "kam",
    "kde",
    "kea",
    "kgp",
    "khq",
    "ki",
    "kk",
    "kkj",
    "kl",
    "kln",
    "km",
    "kn",
    "ko",
    "ko-KP",
    "kok",
    "ks",
    "ks-Arab",
    "ksb",
    "ksf",
    "ksh",
    "ku",
    "kw",
    "ky",
    "lag",
    "lb",
    "lg",
    "lkt",
    "ln",
    "ln-AO",
    "ln-CF",
    "ln-CG",
    "lo",
    "lrc",
    "lrc-IQ",
    "lt",
    "lu",
    "luo",
    "luy",
    "lv",
    "mai",
    "mas",
    "mas-TZ",
    "mer",
    "mfe",
    "mg",
    "mgh",
    "mgo",
    "mi",
    "mk",
    "ml",
    "mn",
    "mni",
    "mni-Beng",
    "mr",
    "ms",
    "ms-BN",
    "ms-ID",
    "ms-SG",
    "mt",
    "mua",
    "my",
    "mzn",
    "naq",
    "nb",
    "nb-SJ",
    "nd",
    "nds",
    "nds-NL",
    "ne",
    "ne-IN",
    "nl",
    "nl-AW",
    "nl-BE",
    "nl-BQ",
    "nl-CW",
    "nl-SR",
    "nl-SX",
    "nmg",
    "nn",
    "nnh",
    "no",
    "nus",
    "nyn",
    "om",
    "om-KE",
    "or",
    "os",
    "os-RU",
    "pa",
    "pa-Arab",
    "pa-Guru",
    "pcm",
    "pl",
    "ps",
    "ps-PK",
    "pt",
    "pt-AO",
    "pt-CH",
    "pt-CV",
    "pt-GQ",
    "pt-GW",
    "pt-LU",
    "pt-MO",
    "pt-MZ",
    "pt-PT",
    "pt-ST",
    "pt-TL",
    "qu",
    "qu-BO",
    "qu-EC",
    "rm",
    "rn",
    "ro",
    "ro-MD",
    "rof",
    "ru",
    "ru-BY",
    "ru-KG",
    "ru-KZ",
    "ru-MD",
    "ru-UA",
    "rw",
    "rwk",
    "sa",
    "sah",
    "saq",
    "sat",
    "sat-Olck",
    "sbp",
    "sc",
    "sd",
    "sd-Arab",
    "sd-Deva",
    "se",
    "se-FI",
    "se-SE",
    "seh",
    "ses",
    "sg",
    "shi",
    "shi-Latn",
    "shi-Tfng",
    "si",
    "sk",
    "sl",
    "smn",
    "sn",
    "so",
    "so-DJ",
    "so-ET",
    "so-KE",
    "sq",
    "sq-MK",
    "sq-XK",
    "sr",
    "sr-Cyrl",
    "sr-Cyrl-BA",
    "sr-Cyrl-ME",
    "sr-Cyrl-XK",
    "sr-Latn",
    "sr-Latn-BA",
    "sr-Latn-ME",
    "sr-Latn-XK",
    "su",
    "su-Latn",
    "sv",
    "sv-AX",
    "sv-FI",
    "sw",
    "sw-CD",
    "sw-KE",
    "sw-UG",
    "ta",
    "ta-LK",
    "ta-MY",
    "ta-SG",
    "te",
    "teo",
    "teo-KE",
    "tg",
    "th",
    "ti",
    "ti-ER",
    "tk",
    "to",
    "tr",
    "tr-CY",
    "tt",
    "twq",
    "tzm",
    "ug",
    "uk",
    "und",
    "ur",
    "ur-IN",
    "uz",
    "uz-Arab",
    "uz-Cyrl",
    "uz-Latn",
    "vai",
    "vai-Latn",
    "vai-Vaii",
    "vi",
    "vun",
    "wae",
    "wo",
    "xh",
    "xog",
    "yav",
    "yi",
    "yo",
    "yo-BJ",
    "yrl",
    "yrl-CO",
    "yrl-VE",
    "yue",
    "yue-Hans",
    "yue-Hant",
    "zgh",
    "zh",
    "zh-Hans",
    "zh-Hans-HK",
    "zh-Hans-MO",
    "zh-Hans-SG",
    "zh-Hant",
    "zh-Hant-HK",
    "zh-Hant-MO",
    "zu",
]

CLDR_RAW_FILES = ["cldr-raw/%s.json" % locale for locale in ALL_LOCALES]

ts_script(
    name = "cldr-raw",
    srcs = [
        "scripts/extract-relative.ts",
        ":node_modules/@formatjs/ecma402-abstract",
        "//:node_modules/@types/json-stable-stringify",
        "//:node_modules/cldr-core",
        "//:node_modules/cldr-dates-full",
        "//:node_modules/cldr-numbers-full",
        "//:node_modules/fast-glob",
        "//:node_modules/fs-extra",
        "//:node_modules/json-stable-stringify",
        "//:node_modules/minimist",
    ],
    outs = CLDR_RAW_FILES,
    args = [
        "--outDir",
        "cldr-raw",
    ],
    chdir = package_name(),
    entry_point = "scripts/cldr-raw.ts",
)

genrule(
    name = "supported-locales-gen",
    srcs = [],
    outs = ["supported-locales.tmp"],
    cmd = "echo 'export const supportedLocales: string[] = %s' > $@" % ALL_LOCALES,
)

ts_script(
    name = "locale-data",
    srcs = CLDR_RAW_FILES + [
        "//:node_modules/fs-extra",
        "//:node_modules/minimist",
    ],
    outs = ["locale-data/%s.js" % locale for locale in ALL_LOCALES] + ["locale-data/%s.d.ts" % locale for locale in ALL_LOCALES],
    args = [
        "--cldrFile %s" % f
        for f in CLDR_RAW_FILES
    ] + [
        "--outDir",
        "locale-data",
    ],
    chdir = package_name(),
    entry_point = "scripts/cldr.ts",
    visibility = ["//visibility:public"],
)

[genrule(
    name = "tests-locale-data-%s" % locale,
    srcs = ["cldr-raw/%s.json" % locale],
    outs = ["tests-locale-data/%s.json" % locale],
    cmd = "cp $< $@",
) for locale in TEST_LOCALES]

generate_src_file(
    name = "test262-main",
    src = "test262-main.ts",
    args = [
        "--cldrFile %s/cldr-raw/%s.json" % (
            package_name(),
            f,
        )
        for f in ALL_LOCALES
    ],
    data = [":cldr-raw"],
    entry_point = "scripts/test262-main-gen.ts",
    visibility = [
        "//:__pkg__",
    ],
)

# Test262
esbuild(
    name = "test262-polyfill",
    srcs = [":srcs"],
    entry_point = "test262-main.ts",
    target = "es6",
    deps = SRC_DEPS,
)

test262_harness_bin.test262_harness_test(
    name = "test262",
    args = [
        "--reporter-keys",
        "file,attrs,result",
        "--errorForFailures",
        "--timeout",
        "30000",
        "--prelude",
        "$(rootpath test262-polyfill.js)",
        "--test262Dir",
        "../_main~_repo_rules~com_github_tc39_test262",
        "../_main~_repo_rules~com_github_tc39_test262/test/intl402/RelativeTimeFormat/**/*.js",
    ],
    data = [
        "test262-polyfill.js",
        "@com_github_tc39_test262//:test262-harness-copy",
        "@com_github_tc39_test262//:test262-relativetimeformat-copy",
    ],
    tags = ["manual"],
)

bundle_karma_tests(
    name = "bundled-karma-tests",
    srcs = [":srcs"],
    data = TEST_LOCALE_DATA,
    esbuild_deps = [
        ":node_modules/@formatjs/intl-pluralrules",
        ":node_modules/@formatjs/intl-getcanonicallocales",
        ":node_modules/@formatjs/intl-locale",
    ],
    tests = TESTS,
    deps = SRC_DEPS,
)

write_source_files(
    name = "generated-files",
    files = {
        "supported-locales.generated.ts": ":supported-locales-gen",
        "tsconfig.json": "//tools:tsconfig.golden.json",
    },
    visibility = ["//:__pkg__"],
)

write_source_files(
    name = "generated-test-files",
    files = {
        "tests/locale-data/%s.json" % k: ":tests-locale-data/%s.json" % k
        for k in TEST_LOCALES
    },
    visibility = ["//:__pkg__"],
)

esbuild(
    name = "polyfill.iife",
    srcs = [":srcs"],
    entry_point = "polyfill.ts",
    target = "es6",
    deps = [
        "//:node_modules/tslib",
    ] + SRC_DEPS,
)

package_json_test(
    name = "package_json_test",
    deps = SRC_DEPS,
)

copy_to_bin(
    name = "srcs",
    srcs = SRCS,
)
