"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.filterFormDataByRole = filterFormDataByRole;
const logger_1 = require("../../../utils/logger");
// Маппинг типов полей к их конфигурации
const fieldTypeConfigMap = {
    textFields: { allowedKey: 'textFields', notVisibleKey: 'notVisibleTextFields' },
    comboboxFields: { allowedKey: 'comboboxFields', notVisibleKey: 'notVisibleComboboxFields' },
    multiComboboxFields: { allowedKey: 'multiComboboxFields', notVisibleKey: 'notVisibleMultiComboboxFields' },
    daDataFields: { allowedKey: 'daDataFields', notVisibleKey: 'notVisibleDaDataFields' },
    fileFields: { allowedKey: 'fileFields', notVisibleKey: 'notVisibleFileFields' },
    checkboxes: { allowedKey: 'checkboxes', notVisibleKey: 'notVisibleCheckboxes' },
    toggleButtons: { allowedKey: 'toggleButtons', notVisibleKey: 'notVisibleToggleButtons' },
    radioButtons: { allowedKey: 'radioButtons', notVisibleKey: 'notVisibleRadioButtons' }
};
function filterFormDataByRoleImpl(formData, config, fieldType, loggerContext) {
    const logContext = loggerContext ?? 'FormDataFilterUtils.filterFormDataByRole';
    if (!config) {
        return formData;
    }
    // Обработка radioButtons
    if (fieldType === 'radioButtons') {
        return filterRadioButtons(formData, config, logContext);
    }
    // Обработка остальных типов
    return filterObjectFields(formData, config, fieldType, logContext);
}
function filterRadioButtons(data, config, logContext) {
    const keys = data ?? [];
    const allowed = config.radioButtons || [];
    const notVisible = config.notVisibleRadioButtons || [];
    const filtered = keys.filter(key => {
        if (notVisible.includes(key)) {
            logger_1.logger.debug(`Радио-кнопка ${key} скрыта для роли`, logContext);
            return false;
        }
        if (allowed.length > 0 && !allowed.includes(key)) {
            logger_1.logger.debug(`Радио-кнопка ${key} не доступна для роли`, logContext);
            return false;
        }
        return true;
    });
    return filtered.length === 0 ? undefined : filtered;
}
function filterObjectFields(data, config, fieldType, logContext) {
    const typeConfig = fieldTypeConfigMap[fieldType];
    const allowedFields = config[typeConfig.allowedKey] || [];
    const notVisibleFields = config[typeConfig.notVisibleKey] || [];
    const filteredData = {};
    for (const [key, value] of Object.entries(data)) {
        if (notVisibleFields.includes(key)) {
            logger_1.logger.debug(`Поле ${key} пропущено, т.к. оно скрыто для роли`, logContext);
            continue;
        }
        if (allowedFields.length > 0 && !allowedFields.includes(key)) {
            logger_1.logger.debug(`Поле ${key} пропущено, т.к. оно не доступно для роли`, logContext);
            continue;
        }
        // Валидация типа значения
        if (!isValidValueForFieldType(value, fieldType)) {
            logger_1.logger.debug(`Поле ${key} имеет неверный тип для ${fieldType}`, logContext);
            continue;
        }
        filteredData[key] = value;
    }
    return Object.keys(filteredData).length > 0 ? filteredData : {};
}
function isValidValueForFieldType(value, fieldType) {
    switch (fieldType) {
        case 'textFields':
        case 'fileFields':
            return typeof value === 'string';
        case 'comboboxFields':
            return typeof value === 'string' || isSelectValue(value);
        case 'checkboxes':
            return typeof value === 'boolean';
        case 'toggleButtons':
            return typeof value === 'boolean' || value === 'Yes' || value === 'No';
        case 'multiComboboxFields':
            return Array.isArray(value) && value.every(isSelectValue);
        case 'daDataFields':
            return isDaDataValue(value);
        default:
            return true;
    }
}
function isSelectValue(value) {
    return (typeof value === 'object' &&
        value !== null &&
        'inputValue' in value &&
        'selectValue' in value &&
        typeof value.inputValue === 'string' &&
        typeof value.selectValue === 'string');
}
function isDaDataValue(value) {
    if (!isSelectValue(value))
        return false;
    const daDataValue = value;
    return daDataValue.expectedValue === undefined || typeof daDataValue.expectedValue === 'string';
}
// Основная реализация
function filterFormDataByRole(formData, config, fieldType, loggerContext) {
    return filterFormDataByRoleImpl(formData, config, fieldType, loggerContext);
}
