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

import { DS4 } from "../config";
import { notifications } from "../ui/notifications";
import { getGame } from "../utils/utils";
import { getActiveActorAndToken } from "./helpers";

/**
 * Creates a macro from a check drop.
 * Get an existing roll check macro if one exists, otherwise create a new one.
 * @param {import("../documents/actor/actor-data-properties-base").Check} check The name of the check to perform
 * @param {string} slot                                                         The hotbar slot to use
 * @returns {Promise<void>} A promise that resoolves when the macro has been created.
 */
export async function createRollCheckMacro(check, slot) {
    const macro = await getOrCreateRollCheckMacro(check);
    await getGame().user?.assignHotbarMacro(macro ?? null, slot);
}

/**
 * @param {import("../documents/actor/actor-data-properties-base").Check} check The name of the check to perform
 * @returns {Promise<Macro|undefined>} A promise that resolves to the created macro
 */
async function getOrCreateRollCheckMacro(check) {
    const command = `game.ds4.macros.rollCheck("${check}");`;

    const existingMacro = getGame().macros?.find(
        (m) => m.name === DS4.i18n.checks[check] && m.data.command === command,
    );
    if (existingMacro) {
        return existingMacro;
    }

    return Macro.create(
        {
            command,
            name: DS4.i18n.checks[check],
            type: "script",
            img: DS4.icons.checks[check],
            flags: { "ds4.checkMacro": true },
        },
        { renderSheet: false },
    );
}

/**
 * Executes the roll check macro for the given check.
 * @param {import("../documents/actor/actor-data-properties-base").Check} check The name of the check to perform
 * @returns {Promise<void>} A promise that resolves once the check has been performed.
 */
export async function rollCheck(check) {
    const { actor, token } = getActiveActorAndToken();
    if (!actor) {
        return notifications.warn(getGame().i18n.localize("DS4.WarningMustControlActorToUseRollCheckMacro"));
    }

    return actor.rollCheck(check, { speaker: { token } }).catch((e) => notifications.error(e, { log: true }));
}