"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FormFieldAssertions = void 0;
const test_1 = require("@playwright/test");
const timeouts_1 = require("../../../../timeouts");
const logger_1 = require("../../../../utils/logger");
const FormFieldLocatorResolver_1 = require("./FormFieldLocatorResolver");
const FormFieldAssertionUtils_1 = require("./FormFieldAssertionUtils");
const FormFieldValueUtils_1 = require("./FormFieldValueUtils");
/**
 * Проверка значений полей формы.
 */
class FormFieldAssertions {
    /**
     * Проверяет значение combobox по ключу из реестра локаторов.
     * @param fieldKey — ключ поля из FormFieldsLocators.comboboxFieldsLocators
     * @param expectedValue — ожидаемое отображаемое значение (префикс `=` для exact)
     * @param locators — реестр локаторов полей формы
     * @param context — контекст для логирования
     */
    async verifyComboboxValue(fieldKey, expectedValue, locators, context = 'формы') {
        const comboboxField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.comboboxFieldsLocators, fieldKey, 'combobox', context);
        await (0, FormFieldAssertionUtils_1.expectComboboxValue)(comboboxField, expectedValue);
        logger_1.logger.info(`Combobox "${fieldKey}" содержит ожидаемое значение: "${expectedValue}"`);
    }
    /**
     * Проверяет значения полей формы по реестру локаторов.
     * Поддерживает text, combobox, multi-combobox, file, radio, checkbox, toggle и DaData поля.
     * @param values — ожидаемые значения полей
     * @param locators — реестр локаторов полей формы
     * @param context — контекст для логирования
     */
    async verifyFormFieldsValues(values, locators, context = 'формы') {
        const expectedCount = (0, FormFieldValueUtils_1.countFormFieldsValues)(values);
        logger_1.logger.info(`Начало проверки значений ${context} (${expectedCount} полей)`);
        if (values.textFields) {
            await test_1.test.step('Проверка значений в текстовых полях', async () => {
                await Promise.all(Object.entries(values.textFields).map(async ([fieldKey, expectedValue]) => {
                    const textField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.textFieldsLocators, fieldKey, 'text', context);
                    await test_1.test.step(`Проверка значения текстового поля ${fieldKey}`, async () => {
                        await test_1.expect.soft(textField).toHaveValue(expectedValue, { timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        logger_1.logger.info(`Текстовое поле "${fieldKey}" = "${expectedValue}"`);
                    });
                }));
            });
        }
        if (values.comboboxFields) {
            await test_1.test.step('Проверка значений в combobox полях', async () => {
                await Promise.all(Object.entries(values.comboboxFields).map(async ([fieldKey, expectedValue]) => {
                    const comboboxField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.comboboxFieldsLocators, fieldKey, 'combobox', context);
                    await test_1.test.step(`Проверка значения combobox поля ${fieldKey}`, async () => {
                        await (0, FormFieldAssertionUtils_1.expectComboboxValue)(comboboxField, expectedValue, { soft: true });
                        logger_1.logger.info(`Combobox "${fieldKey}" = "${expectedValue}"`);
                    });
                }));
            });
        }
        if (values.fileFields) {
            await test_1.test.step('Проверка значений в file полях', async () => {
                await Promise.all(Object.entries(values.fileFields).map(async ([fieldKey, expectedValue]) => {
                    const fileField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.fileFieldsLocators, fieldKey, 'file', context);
                    await test_1.test.step(`Проверка значения file поля ${fieldKey}`, async () => {
                        await test_1.expect.soft(fileField).toHaveValue(expectedValue, { timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        logger_1.logger.info(`File поле "${fieldKey}" = "${expectedValue}"`);
                    });
                }));
            });
        }
        if (values.radioButtons) {
            await test_1.test.step('Проверка значений в radioButtons', async () => {
                await Promise.all(values.radioButtons.map(async (radioKey) => {
                    const radioButton = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.radioButtonsLocators, radioKey, 'radio', context);
                    await test_1.test.step(`Проверка состояния radioButton ${radioKey}`, async () => {
                        await test_1.expect.soft(radioButton).toBeChecked({ timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        logger_1.logger.info(`RadioButton "${radioKey}" выбран`);
                    });
                }));
            });
        }
        if (values.checkboxes) {
            await test_1.test.step('Проверка значений в checkboxes', async () => {
                await Promise.all(Object.entries(values.checkboxes).map(async ([checkboxKey, expectedValue]) => {
                    const checkbox = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.checkboxesLocators, checkboxKey, 'checkbox', context);
                    await test_1.test.step(`Проверка состояния чекбокса ${checkboxKey}`, async () => {
                        if (expectedValue) {
                            await test_1.expect.soft(checkbox).toBeChecked({ timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        }
                        else {
                            await test_1.expect.soft(checkbox).not.toBeChecked({ timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        }
                        logger_1.logger.info(`Чекбокс "${checkboxKey}" = ${expectedValue}`);
                    });
                }));
            });
        }
        if (values.toggleButtons) {
            await test_1.test.step('Проверка значений в toggleButtons', async () => {
                await Promise.all(Object.entries(values.toggleButtons).map(async ([toggleKey, expectedValue]) => {
                    const toggleButton = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.toggleButtonsLocators, toggleKey, 'toggle', context);
                    await test_1.test.step(`Проверка состояния toggle кнопки ${toggleKey}`, async () => {
                        const isChecked = expectedValue === true || expectedValue === 'Yes';
                        if (isChecked) {
                            await test_1.expect.soft(toggleButton).toBeChecked({ timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        }
                        else {
                            await test_1.expect.soft(toggleButton).not.toBeChecked({ timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        }
                        logger_1.logger.info(`Toggle "${toggleKey}" = ${isChecked}`);
                    });
                }));
            });
        }
        if (values.daDataFields) {
            await test_1.test.step('Проверка значений в daData полях', async () => {
                await Promise.all(Object.entries(values.daDataFields).map(async ([daDataKey, expectedValue]) => {
                    const daDataField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.daDataFieldsLocators, daDataKey, 'DaData', context);
                    await test_1.test.step(`Проверка значения daData поля ${daDataKey}`, async () => {
                        await test_1.expect.soft(daDataField).toHaveValue(expectedValue, { timeout: (0, timeouts_1.getTimeouts)().EXPECT });
                        logger_1.logger.info(`DaData поле "${daDataKey}" = "${expectedValue}"`);
                    });
                }));
            });
        }
        if (values.multiComboboxFields) {
            await test_1.test.step('Проверка значений в multiCombobox полях', async () => {
                await Promise.all(Object.entries(values.multiComboboxFields).map(async ([fieldKey, expectedValuesArray]) => {
                    const multiComboboxField = (0, FormFieldLocatorResolver_1.requireFieldLocator)(locators.multiComboboxFieldsLocators, fieldKey, 'multi-combobox', context);
                    await test_1.test.step(`Проверка значения multiCombobox поля ${fieldKey}`, async () => {
                        await (0, FormFieldAssertionUtils_1.expectMultiComboboxValues)(multiComboboxField, expectedValuesArray);
                        logger_1.logger.info(`MultiCombobox "${fieldKey}" = [${expectedValuesArray.join(', ')}]`);
                    });
                }));
            });
        }
        logger_1.logger.info(`Проверка значений ${context} завершена (${expectedCount} полей)`);
    }
}
exports.FormFieldAssertions = FormFieldAssertions;
