"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CardBlockRowActionsService = void 0;
const logger_1 = require("../../../utils/logger");
/**
 * Сервис для работы с действиями над строками в таблицах блоков карточки.
 * Инкапсулирует проверку доступности действий, открытие меню, клики и активацию/деактивацию.
 */
class CardBlockRowActionsService {
    constructor(deps) {
        this.getRole = deps.getRole;
        this.validateBlockParams = deps.validateBlockParams;
        this.getConfig = deps.getConfig;
        this.getRowActionButtons = deps.getRowActionButtons;
        this.getMenuItems = deps.getMenuItems;
        this.base = deps.base;
        this.findModalWindowConfig = deps.findModalWindowConfig;
        this.confirmAction = deps.confirmAction;
    }
    isRowActionAvailable(blockKey, actionKey, logContext) {
        const role = this.getRole();
        const config = this.getConfig(blockKey, role);
        if (!config) {
            return false;
        }
        try {
            if (config.notVisibleActions && config.notVisibleActions.includes(actionKey)) {
                return false;
            }
            if (config.actions.type === 'menu') {
                return config.actions.menuItems.includes(actionKey);
            }
            logger_1.logger.debug(`Проверка доступности действия ${actionKey} для блока ${blockKey} и роли ${role}`, `${logContext}.isRowActionAvailable`);
            return config.actions.buttons.includes(actionKey);
        }
        catch (error) {
            throw new Error(`Действие ${actionKey} для блока ${blockKey} и роли ${role} не доступно`);
        }
    }
    async openRowActionsMenu(blockKey, rowLocator, logContext) {
        const role = this.getRole();
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config || config.actions.type !== 'menu') {
            throw new Error('Меню действий не настроено для этого блока');
        }
        const rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        if (!rowActionButtons || !rowActionButtons[config.actions.menuButtonKey]) {
            throw new Error(`Кнопка меню ${config.actions.menuButtonKey} не найдена в блоке ${blockKey}`);
        }
        logger_1.logger.debug(`Открытие меню действий для блока ${blockKey} и роли ${role}`, `${logContext}.openRowActionsMenu`);
        await this.base.openRowActionsMenuBase(rowActionButtons[config.actions.menuButtonKey]);
    }
    async closeRowActionsMenu() {
        await this.base.closeRowActionsMenuBase();
    }
    async clickRowAction(blockKey, rowLocator, actionKey, logContext) {
        const role = this.getRole();
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            throw new Error(`Действия строки не настроены для блока ${blockKey}`);
        }
        logger_1.logger.debug(`Выполнение действия ${actionKey} для блока ${blockKey} и роли ${role}`, `${logContext}.clickRowAction`);
        let rowActionButtons = null;
        if (config.actions.type === 'buttons' || config.actions.type === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        await this.base.clickRowActionBase(actionKey, config, rowActionButtons, this.getMenuItems(blockKey));
    }
    async checkGridRowActions(blockKey, rowLocator, logContext) {
        const role = this.getRole();
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            logger_1.logger.debug(`Действия строки не настроены для блока ${blockKey}`, `${logContext}.checkGridRowActions`);
            return;
        }
        logger_1.logger.debug(`Проверка действий строки для блока ${blockKey} и роли ${role}`, `${logContext}.checkGridRowActions`);
        let rowActionButtons = null;
        if (config.actions.type === 'buttons' || config.actions.type === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        await this.base.checkRowActionsBase(config, rowActionButtons, this.getMenuItems(blockKey));
    }
    async editRow(blockKey, rowLocator, modalWindowKey, logContext) {
        const role = this.getRole();
        logger_1.logger.info(`Начало редактирования строки в блоке ${blockKey} для роли ${role}`, `${logContext}.editRow`);
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            throw new Error(`Действия строки не настроены для блока ${blockKey}`);
        }
        const modalConfig = this.findModalWindowConfig(blockKey, modalWindowKey);
        const modalWindowBody = modalConfig?.modalWindowBody;
        let rowActionButtons = null;
        if (config.actions.type === 'buttons' || config.actions.type === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        const result = await this.base.editRowBase(config, rowActionButtons, this.getMenuItems(blockKey), modalWindowBody);
        if (result) {
            logger_1.logger.debug(`Модальное окно редактирования успешно открыто для блока ${blockKey} и роли ${role}`, `${logContext}.editRow`);
        }
        return result;
    }
    async viewRow(blockKey, rowLocator, modalWindowKey, logContext) {
        const role = this.getRole();
        logger_1.logger.info(`Начало просмотра строки в блоке ${blockKey} для роли ${role}`, `${logContext}.viewRow`);
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            throw new Error(`Действия строки не настроены для блока ${blockKey}`);
        }
        const modalConfig = this.findModalWindowConfig(blockKey, modalWindowKey);
        const modalWindowBody = modalConfig?.modalWindowBody;
        let rowActionButtons = null;
        if (config.actions.type === 'buttons' || config.actions.type === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        const result = await this.base.viewRowBase(config, rowActionButtons, this.getMenuItems(blockKey), modalWindowBody);
        if (result) {
            logger_1.logger.debug(`Модальное окно просмотра успешно открыто для блока ${blockKey} и роли ${role}`, `${logContext}.viewRow`);
        }
        return result;
    }
    async deleteRow(blockKey, rowLocator, confirmDelete, logContext) {
        const role = this.getRole();
        logger_1.logger.info(`Начало удаления строки в блоке ${blockKey} для роли ${role} (подтверждение: ${confirmDelete})`, `${logContext}.deleteRow`);
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            throw new Error(`Действия строки не настроены для блока ${blockKey}`);
        }
        let rowActionButtons = null;
        if (config.actions.type === 'buttons' || config.actions.type === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        const result = await this.base.deleteRowBase(config, rowActionButtons, this.getMenuItems(blockKey), confirmDelete);
        logger_1.logger.debug(`Строка успешно удалена в блоке ${blockKey} для роли ${role}`, `${logContext}.deleteRow`);
        return result;
    }
    async toggleActivationForCard(blockKey, rowLocator, action, actionType, requireConfirmation, logContext) {
        const role = this.getRole();
        this.validateBlockParams(blockKey, role);
        const config = this.getConfig(blockKey, role);
        if (!config) {
            throw new Error(`Действия строки не настроены для блока ${blockKey}`);
        }
        const finalActionType = actionType || config.actions.type;
        const actionKey = action === 'activate'
            ? (finalActionType === 'menu' ? 'MenuItemActivate' : 'ButtonActivate')
            : (finalActionType === 'menu' ? 'MenuItemDeactivate' : 'ButtonDeactivate');
        logger_1.logger.debug(`${action === 'activate' ? 'Активация' : 'Деактивация'} через ${finalActionType === 'menu' ? 'меню' : 'кнопку'} для блока ${blockKey} и роли ${role} (подтверждение: ${requireConfirmation || false})`, `${logContext}.toggleActivationForCard`);
        let actionConfig;
        if (finalActionType === 'menu') {
            if (config.actions.type === 'menu') {
                actionConfig = config;
            }
            else {
                actionConfig = {
                    actions: {
                        type: 'menu',
                        menuButtonKey: 'RowMenuButton',
                        menuItems: [actionKey]
                    }
                };
            }
        }
        else {
            if (config.actions.type === 'buttons') {
                actionConfig = config;
            }
            else {
                actionConfig = {
                    actions: {
                        type: 'buttons',
                        buttons: [actionKey]
                    }
                };
            }
        }
        let rowActionButtons = null;
        if (finalActionType === 'buttons' || finalActionType === 'menu') {
            rowActionButtons = this.getRowActionButtons(blockKey, rowLocator);
        }
        await this.base.clickRowActionBase(actionKey, actionConfig, rowActionButtons, this.getMenuItems(blockKey));
        if (requireConfirmation) {
            await this.confirmAction();
        }
        logger_1.logger.info(`${action === 'activate' ? 'Активация' : 'Деактивация'} выполнена успешно для блока ${blockKey}`, `${logContext}.toggleActivationForCard`);
    }
}
exports.CardBlockRowActionsService = CardBlockRowActionsService;
