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

import { getGame } from "../../utils/utils";
import { DS4Alphabet } from "./alphabet/alphabet";
import { DS4Armor } from "./armor/armor";
import { DS4Equipment } from "./equipment/equipment";
import { DS4Item } from "./item";
import { DS4Language } from "./language/language";
import { DS4Loot } from "./loot/loot";
import { DS4RacialAbility } from "./racial-ability/racial-ability";
import { DS4Shield } from "./shield/shield";
import { DS4SpecialCreatureAbility } from "./special-creature-ability/special-creature-ability";
import { DS4Spell } from "./spell/spell";
import { DS4Talent } from "./talent/talent";
import { DS4Weapon } from "./weapon/weapon";

const handler = {
    /**
     * @param {typeof import("./item").DS4Item}
     * @param {unknown[]} args
     */
    construct(_, args) {
        switch (args[0]?.type) {
            case "alphabet":
                return new DS4Alphabet(...args);
            case "armor":
                return new DS4Armor(...args);
            case "equipment":
                return new DS4Equipment(...args);
            case "language":
                return new DS4Language(...args);
            case "loot":
                return new DS4Loot(...args);
            case "racialAbility":
                return new DS4RacialAbility(...args);
            case "shield":
                return new DS4Shield(...args);
            case "specialCreatureAbility":
                return new DS4SpecialCreatureAbility(...args);
            case "spell":
                return new DS4Spell(...args);
            case "talent":
                return new DS4Talent(...args);
            case "weapon":
                return new DS4Weapon(...args);
            default:
                throw new Error(getGame().i18n.format("DS4.ErrorInvalidItemType", { type: args[0]?.type }));
        }
    },
};

/** @type {typeof import("./item").DS4Item} */
export const DS4ItemProxy = new Proxy(DS4Item, handler);