// 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();