"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GridModalService = void 0;
const test_1 = require("@playwright/test");
const timeouts_1 = require("../../../timeouts");
const logger_1 = require("../../../utils/logger");
/**
 * Сервис для работы с модальными окнами в грид-страницах.
 * Инкапсулирует открытие модалки и проверки видимости элементов по конфигурации.
 */
class GridModalService {
    constructor(modalBody, locators) {
        this.modalBody = modalBody;
        this.locators = locators;
    }
    /**
     * Открывает модальное окно по кнопке-триггеру.
     * Вызывает переданный callback для проверки отсутствия ошибок после открытия.
     */
    async openModalWindow(triggerButton, checkNoError, logContext) {
        logger_1.logger.debug(`Открытие модального окна`, `${logContext}.openModalWindow`);
        try {
            await test_1.test.step(`Открытие модального окна`, async () => {
                await triggerButton.click();
                await this.modalBody.waitFor({ state: 'visible', timeout: timeouts_1.TIMEOUTS.MODAL_WINDOW_WAIT });
                await checkNoError();
            });
            logger_1.logger.info(`Модальное окно успешно открыто`, `${logContext}.openModalWindow`);
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при открытии модального окна: ${error}`, `${logContext}.openModalWindow`);
            let errors;
            errors = await checkNoError();
            if (errors && errors.length > 0) {
                throw new Error(`Обнаружены уведомления об ошибках на странице: "${errors.join('"; "')}".`);
            }
            throw new Error('Модальное окно не было открыто');
        }
    }
    /**
     * Проверяет видимость кнопок в модальном окне.
     */
    async checkButtons(config, modalWindowKey, logContext) {
        logger_1.logger.debug(`Проверка кнопок модального окна`, `${logContext}.checkModalWindowButtons`);
        const buttons = this.locators.getButtons(modalWindowKey);
        if (!buttons) {
            logger_1.logger.warn(`Кнопки модального окна не найдены (modalWindowKey: ${modalWindowKey})`, `${logContext}.checkModalWindowButtons`);
            return;
        }
        const allButtons = config.buttons.concat(config.notVisibleButtons || []);
        for (const buttonKey of allButtons) {
            if (!buttons[buttonKey]) {
                logger_1.logger.warn(`Кнопка с ключом ${buttonKey} не найдена в модальном окне`, `${logContext}.checkModalWindowButtons`);
                continue;
            }
            logger_1.logger.debug(`Проверка кнопки ${buttonKey} в модальном окне`, `${logContext}.checkModalWindowButtons`);
            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}.checkModalWindowButtons`);
    }
    /**
     * Проверяет видимость и редактируемость полей в модальном окне.
     */
    async checkFields(config, modalWindowKey, logContext) {
        logger_1.logger.debug(`Проверка полей модального окна`, `${logContext}.checkModalWindowInputs`);
        const textFields = this.locators.getTextFields(modalWindowKey);
        if (!textFields) {
            logger_1.logger.warn(`Поля модального окна не найдены (modalWindowKey: ${modalWindowKey})`, `${logContext}.checkModalWindowInputs`);
            return;
        }
        const isReadOnly = config.modalWindowType === 'view';
        const allFields = (config.textFields || []).concat(config.notVisibleTextFields || []);
        for (const fieldKey of allFields) {
            if (!textFields[fieldKey]) {
                logger_1.logger.warn(`Поле с ключом ${fieldKey} не найдено в модальном окне`, `${logContext}.checkModalWindowInputs`);
                continue;
            }
            logger_1.logger.debug(`Проверка поля ${fieldKey} в модальном окне`, `${logContext}.checkModalWindowInputs`);
            if (config.notVisibleTextFields?.includes(fieldKey)) {
                await test_1.test.step(`Проверка отсутствия поля ${fieldKey} в модальном окне блока`, async () => {
                    await test_1.expect.soft(textFields[fieldKey]).toBeHidden();
                });
            }
            else {
                await test_1.test.step(`Проверка видимости поля ${fieldKey} в модальном окне блока`, async () => {
                    await test_1.expect.soft(textFields[fieldKey]).toBeVisible();
                    if (isReadOnly) {
                        await test_1.test.step(`Проверка нередактируемости поля ${fieldKey} в модальном окне блока`, async () => {
                            await test_1.expect.soft(textFields[fieldKey]).toBeDisabled();
                        });
                        logger_1.logger.debug(`Поле ${fieldKey} должно быть нередактируемым (режим просмотра)`, `${logContext}.checkModalWindowInputs`);
                    }
                    else {
                        await test_1.test.step(`Проверка редактируемости поля ${fieldKey} в модальном окне блока`, async () => {
                            await test_1.expect.soft(textFields[fieldKey]).toBeEnabled();
                        });
                        logger_1.logger.debug(`Поле ${fieldKey} должно быть редактируемым (режим добавления/редактирования)`, `${logContext}.checkModalWindowInputs`);
                    }
                });
            }
        }
        logger_1.logger.info(`Проверка полей модального окна завершена. Проверено полей: ${allFields.length}`, `${logContext}.checkModalWindowInputs`);
    }
}
exports.GridModalService = GridModalService;
