"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FormFlowService = void 0;
const test_1 = require("@playwright/test");
const logger_1 = require("../../../utils/logger");
const FormDataFilterUtils_1 = require("./FormDataFilterUtils");
/**
 * Общий L3-поток: фильтрация полей, открытие модалки, заполнение, сохранение.
 */
class FormFlowService {
    constructor(deps, logContext = 'FormFlowService') {
        this.deps = deps;
        this.logContext = logContext;
    }
    validateParams(params) {
        const { rowKey, expectedRowData, formFields } = params;
        if (!formFields || typeof formFields !== 'object') {
            throw new Error('formFields обязателен');
        }
        if (rowKey && !expectedRowData) {
            throw new Error('При передаче rowKey, expectedRowData также обязателен');
        }
        if (expectedRowData && !rowKey) {
            throw new Error('При передаче expectedRowData, rowKey также обязателен');
        }
        if (expectedRowData) {
            if (typeof expectedRowData !== 'object' || Object.keys(expectedRowData).length === 0) {
                throw new Error('expectedRowData должен быть непустым объектом');
            }
        }
    }
    filterFormFields(formFields, modalConfig) {
        return (0, FormDataFilterUtils_1.filterFormFieldsData)(formFields, modalConfig, `${this.logContext}.filterFormFields`);
    }
    async openAndFillModal(modalWindowKey, filteredFields) {
        await this.deps.openModal(modalWindowKey);
        const modalFormLocators = this.deps.getModalFormLocators(modalWindowKey);
        await this.deps.formHelperFillFormFields((0, FormDataFilterUtils_1.toFormFieldsData)(filteredFields), modalFormLocators, 'модального окна');
        const modalButtons = this.deps.getModalButtons(modalWindowKey);
        if (!modalButtons) {
            throw new Error('Кнопки модального окна не найдены');
        }
        const saveKey = this.deps.getSaveButtonKey(modalWindowKey);
        await this.deps.performSave(modalButtons[saveKey], 'Сохранение и закрытие модального окна');
    }
    async fillOpenModalFormFields(modalWindowKey, formFields) {
        this.validateParams({ formFields });
        const role = this.deps.getRole?.() ?? 'unknown';
        logger_1.logger.debug(`Заполнение полей открытой модальной формы. Роль: ${role}`, `${this.logContext}.fillOpenModalFormFields`);
        await test_1.test.step('Заполнение полей открытой модальной формы', async () => {
            let modalConfig;
            try {
                modalConfig = this.deps.findModalConfig(modalWindowKey);
            }
            catch {
                logger_1.logger.warn(`Конфигурация модального окна не найдена. Будут заполнены все переданные поля.`, `${this.logContext}.fillOpenModalFormFields`);
            }
            const filteredFields = this.filterFormFields(formFields, modalConfig);
            const modalFormLocators = this.deps.getModalFormLocators(modalWindowKey);
            await this.deps.formHelperFillFormFields((0, FormDataFilterUtils_1.toFormFieldsData)(filteredFields), modalFormLocators, 'модального окна');
        });
    }
    async fillModalForm(modalWindowKey, formFields) {
        this.validateParams({ formFields });
        await test_1.test.step('Заполнение формы', async () => {
            let modalConfig;
            try {
                modalConfig = this.deps.findModalConfig(modalWindowKey);
            }
            catch {
                logger_1.logger.warn(`Конфигурация модального окна не найдена.`, `${this.logContext}.fillForm`);
            }
            const filteredFields = this.filterFormFields(formFields, modalConfig);
            await this.openAndFillModal(modalWindowKey, filteredFields);
        });
        logger_1.logger.info(`Заполнение формы завершено`, `${this.logContext}.fillForm`);
    }
}
exports.FormFlowService = FormFlowService;
