"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.ModalWindowService = void 0;
const test_1 = require("@playwright/test");
const timeouts_1 = require("../../../timeouts");
const logger_1 = require("../../../utils/logger");
const UiNotificationService_1 = require("../notifications/UiNotificationService");
;
/**
 * Единый L3-сервис модальных окон: открытие, подразделы, сохранение/закрытие, подтверждение.
 */
class ModalWindowService {
    constructor(page, modalDialog, notifications) {
        this.page = page;
        this.modalDialog = modalDialog;
        this.notifications = notifications;
    }
    async openModal(params, logContext) {
        const stepTitle = params.stepTitle ?? 'Открытие модального окна';
        logger_1.logger.debug(stepTitle, `${logContext}.openModal`);
        try {
            await this.notifications.executeWithErrorCheck('открытии модального окна', async () => {
                await test_1.test.step(stepTitle, async () => {
                    await params.triggerButton.click();
                    await this.modalDialog.waitFor({ state: 'visible', timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT });
                });
            });
            logger_1.logger.info('Модальное окно успешно открыто', `${logContext}.openModal`);
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при открытии модального окна: ${error}`, `${logContext}.openModal`);
            if ((0, UiNotificationService_1.isUiNotificationError)(error)) {
                throw error;
            }
            throw new Error('Модальное окно не было открыто');
        }
    }
    async saveModal(params, logContext) {
        const stepTitle = params.stepTitle ?? 'Нажатие сохранение в модальном окне';
        logger_1.logger.debug(stepTitle, `${logContext}.saveModal`);
        try {
            await this.notifications.executeWithErrorCheck('сохранении модального окна', async () => {
                await test_1.test.step(stepTitle, async () => {
                    await params.triggerButton.click();
                    await this.modalDialog.waitFor({ state: 'hidden', timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT });
                });
            });
            logger_1.logger.info('Модальное окно успешно закрыто', `${logContext}.saveModal`);
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при сохранении модального окна: ${error}`, `${logContext}.saveModal`);
            if ((0, UiNotificationService_1.isUiNotificationError)(error)) {
                throw error;
            }
            throw new Error('Модальное окно не было закрыто');
        }
    }
    async openModalCategories(name, logContext) {
        logger_1.logger.info(`Раскрытие подраздела ${name} модального окна`, `${logContext}.openModalCategories`);
        if (typeof name === 'string') {
            await this.page.getByRole('button', { name }).click();
            return;
        }
        for (const categoryName of name) {
            await this.page.getByRole('button', { name: categoryName }).click();
        }
    }
    async performTerminalAction(terminalButton, logContext, stepName = 'Терминальное действие модального окна', haveNextStep) {
        logger_1.logger.debug(stepName, `${logContext}.performModalTerminalActionToCloseModalWindow`);
        try {
            await this.notifications.executeWithErrorCheck('выполнении терминального действия модального окна', async () => {
                await test_1.test.step(stepName, async () => {
                    await terminalButton.click();
                    if (haveNextStep !== true) {
                        await this.modalDialog.waitFor({ state: 'hidden', timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT });
                    }
                });
            }, { includeUrl: true });
            logger_1.logger.info(`Модальное окно успешно закрыто: ${stepName}`, `${logContext}.performModalTerminalAction`);
        }
        catch (error) {
            logger_1.logger.error(`Ошибка при выполнении терминального действия "${stepName}": ${error}`, `${logContext}.performModalTerminalAction`);
            if ((0, UiNotificationService_1.isUiNotificationError)(error)) {
                throw error;
            }
            throw new Error('Модальное окно не было закрыто.');
        }
    }
    async confirmAction(logContext, haveNextStep) {
        const confirmButton = this.page.getByRole('dialog').getByRole('button', { name: 'Подтвердить' });
        const actionConfirmWindow = this.modalDialog.getByRole('heading', { name: 'Необходимо подтвердить действие' });
        await test_1.test.step('Подтверждение действия', async () => {
            try {
                await actionConfirmWindow.waitFor({ state: 'visible', timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT });
                await this.performTerminalAction(confirmButton, logContext, 'Подтверждение действия', haveNextStep);
            }
            catch (error) {
                throw error;
            }
        });
    }
}
exports.ModalWindowService = ModalWindowService;
