"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CertificateHelper = void 0;
const test_1 = require("@playwright/test");
const test_errors_1 = require("../../../utils/test-errors");
const BasePage_locators_1 = require("../BasePage.locators");
const timeouts_1 = require("../../../timeouts");
const test_data_1 = require("../../../test-data");
/** Фамилия владельца сертификата по роли тестового пользователя. */
const CERT_HOLDER_BY_ROLE = {
    Client: test_data_1.userProfileDefaults.client.FullName.trim().split(/\s+/)[0],
    Admin: test_data_1.userProfileDefaults.admin.FullName.trim().split(/\s+/)[0],
    Agent: test_data_1.userProfileDefaults.agent.FullName.trim().split(/\s+/)[0],
    Bank: test_data_1.userProfileDefaults.bank.FullName.trim().split(/\s+/)[0],
    Debtor: test_data_1.userProfileDefaults.debtor.FullName.trim().split(/\s+/)[0]
};
class CertificateHelper {
    /**
     * @param page — страница Playwright
     * @param getRole — роль текущего пользователя из контекста Page Object
     * @param uiNotifications — сервис toast-уведомлений для проверки ошибок UI
     */
    constructor(page, getRole, uiNotifications) {
        this.page = page;
        this.getRole = getRole;
        this.uiNotifications = uiNotifications;
        const locators = (0, BasePage_locators_1.createBasePageLocators)(page);
        this.SignWithCertificateWindow = locators.SignWithCertificateWindow;
    }
    /**
     * Выбор и подписание сертификатом пользователя, соответствующего текущей роли.
     */
    async chooseCertificateAndSign() {
        const certHolder = CERT_HOLDER_BY_ROLE[this.getRole()];
        await test_1.test.step(`Подписание сертификатом пользователя ${certHolder}`, async () => {
            let branch;
            await test_1.test.step(`Проверка видимости окна работы с сертификатами`, async () => {
                try {
                    branch = await Promise.race([
                        this.SignWithCertificateWindow.LoadingCertificateModalWindow.waitFor({
                            state: 'visible',
                            timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT
                        }).then(() => 'certsLoading'),
                        this.SignWithCertificateWindow.SignWithCertificateModalWindow.waitFor({
                            state: 'visible',
                            timeout: (0, timeouts_1.getTimeouts)().MODAL_WINDOW_WAIT
                        }).then(() => 'certsLoaded')
                    ]);
                }
                catch (error) {
                    throw test_errors_1.ErrorFactory.authentication('certificate', 'Модальное окно выбора сертификата не найдено', undefined, { certHolder });
                }
                // Если выполнилась ветка и сертификаты еще не загружены, ждем их загрузки
                if (branch === 'certsLoading') {
                    try {
                        await this.SignWithCertificateWindow.SignWithCertificateModalWindow.waitFor({
                            state: 'visible',
                            timeout: (0, timeouts_1.getTimeouts)().SIGN_WINDOW_WAIT
                        });
                    }
                    catch (error) {
                        throw new Error('Сертификаты для выбора не загрузились!');
                    }
                }
            });
            await test_1.test.step(`Поиск и выбор сертификата пользователя ${certHolder}`, async () => {
                await this.SignWithCertificateWindow.SearchCertificateButton.click();
                await this.SignWithCertificateWindow.SearchCertificateInput.fill(certHolder);
                try {
                    await this.page.getByRole('dialog').getByText(certHolder).click();
                }
                catch (error) {
                    throw test_errors_1.ErrorFactory.authentication('certificate', 'Не удалось выбрать сертификат пользователя', undefined, { certHolder });
                }
            });
            await test_1.test.step(`Подписание`, async () => {
                await this.uiNotifications.executeWithErrorCheck('подписании', async () => {
                    await Promise.all([
                        this.page.waitForResponse((response) => response.url().includes('need-attorney') && response.status() === 200, { timeout: 10000 }),
                        this.SignWithCertificateWindow.SignWithCertificateButton.click()
                    ]);
                    await (0, test_1.expect)(this.SignWithCertificateWindow.SignWithCertificateModalWindow).toBeHidden({ timeout: (0, timeouts_1.getTimeouts)().SIGN_WINDOW_WAIT / 2 });
                });
            });
        });
    }
}
exports.CertificateHelper = CertificateHelper;
