export default class DhHotbar extends foundry.applications.ui.Hotbar {
    constructor(options) {
        super(options);

        this.setupHooks();
    }

    static async useItem(uuid) {
        const item = await fromUuid(uuid);
        if (!item) {
            return ui.notifications.warn('WARNING.ObjectDoesNotExist', {
                format: {
                    name: game.i18n.localize('Document'),
                    identifier: uuid
                }
            });
        }

        await item.use({});
    }

    static async useAction(itemUuid, actionId) {
        const item = await foundry.utils.fromUuid(itemUuid);
        if (!item) {
            return ui.notifications.warn('WARNING.ObjectDoesNotExist', {
                format: {
                    name: game.i18n.localize('Document'),
                    identifier: itemUuid
                }
            });
        }

        const action = item.system.actions.get(actionId);
        if (!action) {
            return ui.notifications.warn('DAGGERHEART.UI.Notifications.actionIsMissing');
        }

        await action.use({});
    }

    static async useAttack(actorUuid) {
        const actor = await foundry.utils.fromUuid(actorUuid);
        if (!actor) {
            return ui.notifications.warn('WARNING.ObjectDoesNotExist', {
                format: {
                    name: game.i18n.localize('Document'),
                    identifier: actorUuid
                }
            });
        }

        const attack = actor.system.attack;
        if (!attack) {
            return ui.notifications.warn('DAGGERHEART.UI.Notifications.attackIsMissing');
        }

        await attack.use({});
    }

    setupHooks() {
        Hooks.on('hotbarDrop', (bar, data, slot) => {
            if (data.type === 'Item') {
                const item = foundry.utils.fromUuidSync(data.uuid);
                if (item.uuid.startsWith('Compendium') || !item.isOwned || !item.isOwner) return true;

                switch (item.type) {
                    case 'ancestry':
                    case 'community':
                    case 'class':
                    case 'subclass':
                        return true;
                    default:
                        this.createItemMacro(item, slot);
                        return false;
                }
            } else if (data.type === 'Action') {
                const item = foundry.utils.fromUuidSync(data.data.itemUuid);
                if (item.uuid.startsWith('Compendium')) return true;
                if (!item.isOwned || !item.isOwner) {
                    ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.unownedActionMacro'));
                    return false;
                }

                this.createActionMacro(data, slot);
                return false;
            } else if (data.type === 'Attack') {
                const actor = foundry.utils.fromUuidSync(data.actorUuid);
                if (actor.uuid.startsWith('Compendium')) return true;
                if (!actor.isOwner) {
                    ui.notifications.warn(game.i18n.localize('DAGGERHEART.UI.Notifications.unownedAttackMacro'));
                    return false;
                }

                this.createAttackMacro(data, slot);
                return false;
            }
        });
    }

    async createItemMacro(data, slot) {
        const macro = await Macro.implementation.create({
            name: data.name,
            type: CONST.MACRO_TYPES.SCRIPT,
            img: data.img,
            command: `await game.system.api.applications.ui.DhHotbar.useItem("${data.uuid}");`
        });
        await game.user.assignHotbarMacro(macro, slot);
    }

    async createActionMacro(data, slot) {
        const macro = await Macro.implementation.create({
            name: data.data.name,
            type: CONST.MACRO_TYPES.SCRIPT,
            img: data.data.img,
            command: `await game.system.api.applications.ui.DhHotbar.useAction("${data.data.itemUuid}", "${data.data.id}");`
        });
        await game.user.assignHotbarMacro(macro, slot);
    }

    async createAttackMacro(data, slot) {
        const macro = await Macro.implementation.create({
            name: data.name,
            type: CONST.MACRO_TYPES.SCRIPT,
            img: data.img,
            command: `await game.system.api.applications.ui.DhHotbar.useAttack("${data.actorUuid}");`
        });
        await game.user.assignHotbarMacro(macro, slot);
    }
}
