"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.GridFormService = void 0;
const test_1 = require("@playwright/test");
const logger_1 = require("../../../utils/logger");
const FormDataFilterUtils_1 = require("../../BasePage/utils/FormDataFilterUtils");
class GridFormService {
    constructor(deps) {
        this.deps = deps;
    }
    validateParams(params) {
        const { triggerButtonKey, rowKey, expectedRowData, formFields } = params;
        // Базовые проверки
        if (!triggerButtonKey?.trim())
            throw new Error('triggerButtonKey обязателен');
        if (!rowKey?.trim())
            throw new Error('rowKey обязателен');
        if (!expectedRowData || typeof expectedRowData !== 'object' || Object.keys(expectedRowData).length === 0) {
            throw new Error('expectedRowData должен быть непустым объектом');
        }
        if (!formFields || typeof formFields !== 'object') {
            throw new Error('formFields обязателен');
        }
    }
    filterFormFields(formFields, modalConfig) {
        const logCtx = `${this.constructor.name}.filterFormDataByRole`;
        return {
            filteredTextFieldsData: formFields.textFieldsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.textFieldsData, modalConfig, 'textFields', logCtx) : undefined,
            filteredComboboxFieldsData: formFields.comboboxFieldsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.comboboxFieldsData, modalConfig, 'comboboxFields', logCtx) : undefined,
            filteredFileFieldsData: formFields.fileFieldsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.fileFieldsData, modalConfig, 'fileFields', logCtx) : undefined,
            filteredRadioButtonsData: formFields.radioButtonsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.radioButtonsData, modalConfig, 'radioButtons', logCtx) : undefined,
            filteredCheckboxesData: formFields.checkboxesData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.checkboxesData, modalConfig, 'checkboxes', logCtx) : undefined,
            filteredToggleButtonsData: formFields.toggleButtonsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.toggleButtonsData, modalConfig, 'toggleButtons', logCtx) : undefined,
            filteredDaDataFieldsData: formFields.daDataFieldsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.daDataFieldsData, modalConfig, 'daDataFields', logCtx) : undefined,
            filteredMultiComboboxFieldsData: formFields.multiComboboxFieldsData ? (0, FormDataFilterUtils_1.filterFormDataByRole)(formFields.multiComboboxFieldsData, modalConfig, 'multiComboboxFields', logCtx) : undefined
        };
    }
    async openAndFillModal(triggerButtonKey, modalWindowKey, filteredFields, saveButtonKey) {
        const { filteredTextFieldsData, filteredComboboxFieldsData, filteredFileFieldsData, filteredRadioButtonsData, filteredCheckboxesData, filteredToggleButtonsData, filteredDaDataFieldsData, filteredMultiComboboxFieldsData } = filteredFields;
        // 1. Открытие модального окна
        const triggerButton = this.deps.getButton(triggerButtonKey);
        if (!triggerButton) {
            throw new Error(`Кнопка с ключом ${triggerButtonKey} не найдена`);
        }
        await test_1.test.step(`Открытие модального окна`, async () => {
            await this.deps.openModalWindow(triggerButton);
        });
        // 2. Получение локаторов
        const modalFormLocators = this.deps.getModalWindowFormLocators(modalWindowKey);
        // 3. Заполнение полей формы
        await this.deps.formHelperFillFormFields({
            textFieldsData: filteredTextFieldsData,
            comboboxFieldsData: filteredComboboxFieldsData,
            fileFieldsData: filteredFileFieldsData,
            radioButtonsData: filteredRadioButtonsData,
            checkboxesData: filteredCheckboxesData,
            toggleButtonsData: filteredToggleButtonsData,
            daDataFieldsData: filteredDaDataFieldsData,
            multiComboboxFieldsData: filteredMultiComboboxFieldsData
        }, modalFormLocators, 'модального окна');
        // 4. Сохранение
        const modalButtons = this.deps.getModalWindowButtons(modalWindowKey);
        if (!modalButtons || !modalButtons[saveButtonKey]) {
            throw new Error(`Кнопка сохранения ${saveButtonKey} не найдена`);
        }
        const modalBody = this.deps.getModalWindowBody(modalWindowKey);
        await this.deps.performModalTerminalActionToCloseModalWindow(modalButtons[saveButtonKey], modalBody, 'Сохранение и закрытие модального окна');
    }
    async fillFormAndAddRow(triggerButtonKey, rowKey, expectedRowData, isFirstRow = false, saveButtonKey = 'ButtonSave', modalWindowKey, formFields, onRowVerified) {
        this.validateParams({ triggerButtonKey, rowKey, expectedRowData, formFields });
        const role = this.deps.getRole();
        logger_1.logger.debug(`Заполнение формы и добавление строки. Кнопка: ${triggerButtonKey}, Роль: ${role}, ${this.constructor.name}.fillFormAndAddRow`);
        await test_1.test.step('Заполнение формы и добавление строки в таблицу', async () => {
            // 1. Получение конфигурации модального окна для роли
            const modalConfig = this.deps.findModalWindowConfig(modalWindowKey, triggerButtonKey);
            if (!modalConfig) {
                logger_1.logger.warn(`Конфигурация модального окна для роли ${role} не найдена. Будут заполнены все переданные поля.`, `${this.constructor.name}.fillFormAndAddRow`);
            }
            // 2. Фильтруем данные формы на основе конфигурации роли
            const filteredFields = this.filterFormFields(formFields, modalConfig);
            // 3. Открываем --> Заполняем форму --> Сохраняем
            await this.openAndFillModal(triggerButtonKey, modalWindowKey, filteredFields, saveButtonKey);
            // 4. Проверка строки в гриде
            logger_1.logger.debug(`Проверка добавленной строки по ключу "${rowKey}", ${this.constructor.name}.fillFormAndAddRow`);
            await this.deps.verifyTableRow(rowKey, expectedRowData, isFirstRow, onRowVerified);
        });
        logger_1.logger.info(`Добавление строки завершено, ${this.constructor.name}.fillFormAndAddRow`);
    }
}
exports.GridFormService = GridFormService;
