"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CardBlockModalService = void 0;
const test_1 = require("@playwright/test");
const logger_1 = require("../../../utils/logger");
/**
 * Сервис для работы с модальными окнами внутри блоков карточки.
 */
class CardBlockModalService {
    constructor(locators, tryFindError) {
        this.locators = locators;
        this.tryFindError = tryFindError;
    }
    /**
     * Открывает модальное окно блока по кнопке-триггеру.
     */
    async openBlockModalWindow(triggerButton, modalWindowBody, logContext) {
        logger_1.logger.debug(`Открытие модального окна блока`, `${logContext}.openBlockModalWindow`);
        try {
            await test_1.test.step(`Открытие модального окна блока`, async () => {
                await triggerButton.click();
                await modalWindowBody.waitFor({ state: 'visible' });
            });
            logger_1.logger.info(`Модальное окно блока успешно открыто`, `${logContext}.openBlockModalWindow`);
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при открытии модального окна блока: ${error}`, `${logContext}.openBlockModalWindow`);
            let errors;
            errors = await this.tryFindError();
            if (errors) {
                throw new Error(`Обнаружены уведомления об ошибках на странице: "${errors.join('"; "')}".`);
            }
            throw new Error('Модальное окно не было открыто');
        }
    }
    /**
     * Проверяет видимость кнопок в модальном окне блока.
     */
    async checkBlockModalWindowButtons(config, modalWindowKey, logContext) {
        logger_1.logger.debug(`Проверка кнопок модального окна блока`, `${logContext}.checkBlockModalWindowButtons`);
        const buttons = this.locators.getButtons(config.blockKey, modalWindowKey);
        if (!buttons) {
            logger_1.logger.warn(`Кнопки модального окна блока ${config.blockKey} не найдены`, `${logContext}.checkBlockModalWindowButtons`);
            return;
        }
        const allButtons = config.buttons.concat(config.notVisibleButtons || []);
        for (const buttonKey of allButtons) {
            if (!buttons[buttonKey]) {
                logger_1.logger.warn(`Кнопка с ключом ${buttonKey} не найдена в модальном окне блока`, `${logContext}.checkBlockModalWindowButtons`);
                continue;
            }
            logger_1.logger.debug(`Проверка кнопки ${buttonKey} в модальном окне блока`, `${logContext}.checkBlockModalWindowButtons`);
            if (config.notVisibleButtons?.includes(buttonKey)) {
                await test_1.test.step(`Проверка отсутствия кнопки ${buttonKey} в модальном окне блока`, async () => {
                    await test_1.expect.soft(buttons[buttonKey]).toBeHidden();
                });
            }
            else {
                await test_1.test.step(`Проверка видимости кнопки ${buttonKey} в модальном окне блока`, async () => {
                    await test_1.expect.soft(buttons[buttonKey]).toBeVisible();
                });
            }
        }
        logger_1.logger.info(`Проверка кнопок модального окна блока завершена. Проверено кнопок: ${allButtons.length}`, `${logContext}.checkBlockModalWindowButtons`);
    }
    /**
     * Проверяет видимость и редактируемость полей в модальном окне блока.
     */
    async checkBlockModalWindowInputs(config, modalWindowKey, logContext) {
        logger_1.logger.debug(`Проверка полей модального окна блока`, `${logContext}.checkBlockModalWindowInputs`);
        const inputs = this.locators.getTextFields(config.blockKey, modalWindowKey);
        if (!inputs) {
            logger_1.logger.warn(`Поля модального окна блока ${config.blockKey} не найдены`, `${logContext}.checkBlockModalWindowInputs`);
            return;
        }
        const isReadOnly = config.modalWindowType === 'view';
        const allInputs = (config.textFields || []).concat(config.notVisibleTextFields || []);
        for (const inputKey of allInputs) {
            if (!inputs[inputKey]) {
                logger_1.logger.warn(`Поле с ключом ${inputKey} не найдено в модальном окне блока`, `${logContext}.checkBlockModalWindowInputs`);
                continue;
            }
            logger_1.logger.debug(`Проверка поля ${inputKey} в модальном окне блока`, `${logContext}.checkBlockModalWindowInputs`);
            if (config.notVisibleTextFields?.includes(inputKey)) {
                await test_1.test.step(`Проверка отсутствия поля ${inputKey} в модальном окне блока`, async () => {
                    await config.modalWindowBody.focus();
                    await test_1.expect.soft(inputs[inputKey]).toBeHidden();
                });
            }
            else {
                await test_1.test.step(`Проверка видимости поля ${inputKey} в модальном окне блока`, async () => {
                    await config.modalWindowBody.focus();
                    await test_1.expect.soft(inputs[inputKey]).toBeVisible();
                    if (isReadOnly) {
                        await test_1.test.step(`Проверка нередактируемости поля ${inputKey} в модальном окне блока`, async () => {
                            await test_1.expect.soft(inputs[inputKey]).toBeDisabled();
                        });
                        logger_1.logger.debug(`Поле ${inputKey} должно быть нередактируемым (режим просмотра)`, `${logContext}.checkBlockModalWindowInputs`);
                    }
                    else {
                        await test_1.test.step(`Проверка редактируемости поля ${inputKey} в модальном окне блока`, async () => {
                            await test_1.expect.soft(inputs[inputKey]).toBeEnabled();
                        });
                        logger_1.logger.debug(`Поле ${inputKey} должно быть редактируемым (режим добавления/редактирования)`, `${logContext}.checkBlockModalWindowInputs`);
                    }
                });
            }
        }
        logger_1.logger.info(`Проверка полей модального окна блока завершена. Проверено полей: ${allInputs.length}`, `${logContext}.checkBlockModalWindowInputs`);
    }
    /**
     * Проверяет одно модальное окно блока (открытие, проверка элементов, закрытие).
     */
    async checkSingleBlockModalWindow(config, modalWindowKey, logContext) {
        logger_1.logger.info(`Проверка модального окна блока ${config.blockKey}`, `${logContext}.checkSingleBlockModalWindow`);
        try {
            const buttons = this.locators.getButtons(config.blockKey, modalWindowKey);
            const blockButtons = this.locators.getBlockButtons(config.blockKey);
            const triggerButton = blockButtons?.[config.triggerButtonKey];
            const closeButton = buttons?.[config.closeButtonKey];
            if (!triggerButton) {
                logger_1.logger.warn(`Кнопка-триггер ${config.triggerButtonKey} не найдена в блоке ${config.blockKey}`, `${logContext}.checkSingleBlockModalWindow`);
                return false;
            }
            if (!closeButton) {
                logger_1.logger.warn(`Кнопка закрытия ${config.closeButtonKey} не найдена`, `${logContext}.checkSingleBlockModalWindow`);
                return false;
            }
            await test_1.test.step(`Проверка модального окна блока ${config.blockKey} (открытие → проверка → закрытие)`, async () => {
                await this.openBlockModalWindow(triggerButton, config.modalWindowBody, logContext);
                try {
                    if (buttons) {
                        await this.checkBlockModalWindowButtons(config, modalWindowKey, logContext);
                    }
                    const inputs = this.locators.getTextFields(config.blockKey, modalWindowKey);
                    if (inputs) {
                        await this.checkBlockModalWindowInputs(config, modalWindowKey, logContext);
                    }
                }
                catch (checkError) {
                    logger_1.logger.error(`Ошибка при проверке элементов модального окна блока ${config.blockKey}: ${checkError}`, `${logContext}.checkSingleBlockModalWindow`);
                }
                finally {
                    await this.locators.performTerminalAction(closeButton, config.modalWindowBody, 'Закрытие модального окна блока');
                }
            });
            logger_1.logger.info(`Проверка модального окна блока ${config.blockKey} завершена успешно`, `${logContext}.checkSingleBlockModalWindow`);
            return true;
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при проверке модального окна блока ${config.blockKey}: ${error}`, `${logContext}.checkSingleBlockModalWindow`);
            return false;
        }
    }
}
exports.CardBlockModalService = CardBlockModalService;
