// /server/game/logic/cooldownLogic.js

// GAME_CONFIG будет передаваться в функции как параметр configToUse
// const GAME_CONFIG_STATIC = require('../../core/config'); // Если нужен для внутренних констант

/**
 * Обрабатывает отсчет общих кулдаунов для способностей игрока в конце его хода.
 * Длительность кулдауна уменьшается на 1.
 * @param {object} cooldownsObject - Объект с кулдаунами способностей ({ abilityId: turnsLeft }).
 * @param {Array<object>} characterAbilities - Полный список способностей персонажа (для получения имени).
 * @param {string} characterName - Имя персонажа (для лога).
 * @param {function} addToLogCallback - Функция для добавления лога.
 * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG).
 */
function processPlayerAbilityCooldowns(cooldownsObject, characterAbilities, characterName, addToLogCallback, configToUse) {
    if (!cooldownsObject || !characterAbilities) {
        // console.warn(`[CooldownLogic] processPlayerAbilityCooldowns: Missing cooldownsObject or characterAbilities for ${characterName}`);
        return;
    }

    for (const abilityId in cooldownsObject) {
        // Проверяем, что свойство принадлежит самому объекту, а не прототипу, и что кулдаун активен
        if (Object.prototype.hasOwnProperty.call(cooldownsObject, abilityId) && cooldownsObject[abilityId] > 0) {
            cooldownsObject[abilityId]--; // Уменьшаем кулдаун

            if (cooldownsObject[abilityId] === 0) {
                const ability = characterAbilities.find(ab => ab.id === abilityId);
                if (ability && addToLogCallback) {
                    addToLogCallback(
                        `Способность "${ability.name}" персонажа ${characterName} снова готова!`,
                        configToUse.LOG_TYPE_INFO // Используем LOG_TYPE_INFO из переданного конфига
                    );
                }
            }
        }
    }
}

/**
 * Обрабатывает отсчет для отключенных (заглушенных) способностей игрока в конце его хода.
 * Длительность заглушения уменьшается на 1.
 * @param {Array<object>} disabledAbilitiesArray - Массив объектов заглушенных способностей.
 * @param {Array<object>} characterAbilities - Полный список способностей персонажа (для получения имени).
 * @param {string} characterName - Имя персонажа (для лога).
 * @param {function} addToLogCallback - Функция для добавления лога.
 * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG).
 */
function processDisabledAbilities(disabledAbilitiesArray, characterAbilities, characterName, addToLogCallback, configToUse) {
    if (!disabledAbilitiesArray || disabledAbilitiesArray.length === 0) {
        return;
    }

    const stillDisabled = []; // Новый массив для активных заглушений
    for (let i = 0; i < disabledAbilitiesArray.length; i++) {
        const dis = disabledAbilitiesArray[i];
        dis.turnsLeft--; // Уменьшаем длительность заглушения

        if (dis.turnsLeft > 0) {
            stillDisabled.push(dis);
        } else {
            // Заглушение закончилось
            if (addToLogCallback) {
                const ability = characterAbilities.find(ab => ab.id === dis.abilityId);
                if (ability) {
                    addToLogCallback(
                        `Способность "${ability.name}" персонажа ${characterName} больше не заглушена!`,
                        configToUse.LOG_TYPE_INFO
                    );
                } else {
                    // Если способность не найдена по ID (маловероятно, но возможно при ошибках данных)
                    addToLogCallback(
                        `Заглушение для неизвестной способности персонажа ${characterName} (ID: ${dis.abilityId}) закончилось.`,
                        configToUse.LOG_TYPE_INFO
                    );
                }
            }
            // Также нужно удалить соответствующий эффект из activeEffects, если он там был (например, playerSilencedOn_X)
            // Это должно происходить в effectsLogic.processEffects, когда эффект с id `playerSilencedOn_${dis.abilityId}` истекает.
            // Здесь мы только управляем массивом `disabledAbilities`.
        }
    }

    // Обновляем исходный массив, удаляя истекшие заглушения
    disabledAbilitiesArray.length = 0; // Очищаем массив (сохраняя ссылку, если она используется где-то еще)
    disabledAbilitiesArray.push(...stillDisabled); // Добавляем обратно только те, что еще активны
}

/**
 * Устанавливает или обновляет кулдаун для способности.
 * Также обрабатывает специальные внутренние кулдауны для Баларда.
 * @param {object} ability - Объект способности, для которой устанавливается кулдаун.
 * @param {object} casterState - Состояние персонажа, применившего способность.
 * @param {object} configToUse - Конфигурационный объект игры (GAME_CONFIG).
 */
function setAbilityCooldown(ability, casterState, configToUse) {
    if (!ability || !casterState || !casterState.abilityCooldowns) {
        console.warn("[CooldownLogic] setAbilityCooldown: Missing ability, casterState, or casterState.abilityCooldowns.");
        return;
    }

    let baseCooldown = 0;
    if (typeof ability.cooldown === 'number' && ability.cooldown > 0) { // Убедимся, что исходный КД > 0
        baseCooldown = ability.cooldown;
    }

    // Специальные внутренние КД для Баларда - они могут перебивать общий КД
    if (casterState.characterKey === 'balard') {
        if (ability.id === configToUse.ABILITY_ID_BALARD_SILENCE &&
            typeof ability.internalCooldownFromConfig === 'string' && // Проверяем, что есть ключ для конфига
            typeof configToUse[ability.internalCooldownFromConfig] === 'number') {
            // Устанавливаем значение для специального счетчика КД Баларда
            casterState.silenceCooldownTurns = configToUse[ability.internalCooldownFromConfig];
            // Этот специальный КД также становится текущим общим КД для этой способности
            baseCooldown = configToUse[ability.internalCooldownFromConfig];
        } else if (ability.id === configToUse.ABILITY_ID_BALARD_MANA_DRAIN &&
            typeof ability.internalCooldownValue === 'number') { // Здесь КД задан прямо в данных способности
            casterState.manaDrainCooldownTurns = ability.internalCooldownValue;
            baseCooldown = ability.internalCooldownValue;
        }
    }

    if (baseCooldown > 0) {
        // Устанавливаем кулдаун. Добавляем +1, так как кулдаун уменьшится в конце текущего хода
        // (когда будет вызван processPlayerAbilityCooldowns для этого персонажа).
        casterState.abilityCooldowns[ability.id] = baseCooldown + 1;
    } else {
        // Если у способности нет базового кулдауна (baseCooldown === 0),
        // убеждаемся, что в abilityCooldowns для нее стоит 0.
        casterState.abilityCooldowns[ability.id] = 0;
    }
}

/**
 * Обрабатывает специальные кулдауны для Баларда в конце его хода.
 * @param {object} balardState - Состояние Баларда.
 */
function processBalardSpecialCooldowns(balardState) {
    if (balardState.characterKey !== 'balard') return;

    if (balardState.silenceCooldownTurns !== undefined && balardState.silenceCooldownTurns > 0) {
        balardState.silenceCooldownTurns--;
    }
    if (balardState.manaDrainCooldownTurns !== undefined && balardState.manaDrainCooldownTurns > 0) {
        balardState.manaDrainCooldownTurns--;
    }
}


module.exports = {
    processPlayerAbilityCooldowns,
    processDisabledAbilities,
    setAbilityCooldown,
    processBalardSpecialCooldowns
};