// SPDX-FileCopyrightText: 2022 Johannes Loher
//
// SPDX-License-Identifier: MIT

import en from "../lang/en.json";

function setupPrimitives() {
    Object.defineProperties(Number, {
        isNumeric: {
            value: function (n: unknown) {
                if (n instanceof Array) return false;
                else if (([null, ""] as unknown[]).includes(n)) return false;
                // @ts-expect-error Abusing JavaScript a bit here, but it's the implementation from foundry
                return +n === +n;
            },
        },
        fromString: {
            value: function (str: unknown) {
                if (typeof str !== "string" || !str.length) return NaN;
                // Remove whitespace.
                str = str.replace(/\s+/g, "");
                return Number(str);
            },
        },
    });

    Object.defineProperties(Math, {
        clamped: {
            value: function (num: number, min: number, max: number) {
                return Math.min(max, Math.max(num, min));
            },
        },
    });
}

function setupStubs() {
    class StubGame {
        constructor() {
            this.i18n = {
                localize: (key: string) => (key in en ? en[key as keyof typeof en] : key),
            };
        }
        i18n: {
            localize: (key: string) => string;
        };
    }

    const game = new StubGame();

    Object.defineProperties(globalThis, {
        game: { value: game },
        Game: { value: StubGame },
    });
}

setupPrimitives();
setupStubs();