"use strict";
/**
 * Display 层：formMap 缓存显示工具
 *
 * 【主要功能】
 * 1. getDisplayValueFromFormMap - 从 formMap 缓存获取字段的显示值（动态格式化）
 * 2. mergeOptionsToFormMap - 将 options 增量合并到 formMap（缓存管理）
 *
 * 【使用场景】
 * - create-field-tag-config.tsx: formatResult 格式化 Tag 显示文本
 * - FieldTagPopup.tsx: 显示弹窗中的字段值
 * - FieldTagPopupWrapper.tsx: 初始化和合并 formMap 缓存
 *
 * 【特点】
 * - 从 formMap 缓存中获取 options（通过 fieldKey 查找）
 * - formMap 会在用户输入或初始化时更新
 * - 适用于动态更新场景（用户输入后实时更新显示）
 *
 * 【与 common-query-display-utils.ts 的区别】
 * - 本文件：从 formMap 缓存获取数据，适用于 Tag 显示、弹窗显示等动态场景
 * - common-query-display-utils.ts：直接使用传入的 options，适用于条件查询列表等静态场景
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.getDisplayValueFromFormMap = getDisplayValueFromFormMap;
exports.mergeOptionsToFormMap = mergeOptionsToFormMap;
const common_query_display_utils_1 = require("./common-query-display-utils");
const employee_select_display_utils_1 = require("./employee-select-display-utils");
const datetime_picker_display_utils_1 = require("./datetime-picker-display-utils");
const address_display_utils_1 = require("./address-display-utils");
/**
 * 基础值转字符串
 */
function valueToString(value) {
    var _a;
    if (typeof value === 'object' && value !== null && 'value' in value) {
        return String((_a = value.value) !== null && _a !== void 0 ? _a : '');
    }
    return String(value !== null && value !== void 0 ? value : '');
}
/**
 * 从 options 中查找 label
 * @returns 找到返回 label，未找到返回 undefined
 */
function findLabelInOptions(searchValue, options, columnType) {
    // 员工选择器：options.value 是对象，需提取 ID 匹配
    const option = (0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType)
        ? options.find((opt) => (0, employee_select_display_utils_1.extractEmployeeId)(opt.value) === searchValue)
        : options.find((opt) => opt.value === searchValue);
    return option === null || option === void 0 ? void 0 : option.label;
}
/**
 * 格式化单个值为显示文本
 */
function formatSingleValue(value, options, columnType) {
    // 1. 数值型组件：仅显示有效数值，非数字（如后端误返 label）不显示
    if ((0, common_query_display_utils_1.isNumericColumnType)(columnType)) {
        const valid = (0, common_query_display_utils_1.getValidNumericForDisplay)(value);
        if (valid === undefined) {
            return '';
        }
        return String(valid);
    }
    // 2. 地址类型组件：从 options 中查找 label
    if ((0, address_display_utils_1.isAddressType)(columnType)) {
        return (0, address_display_utils_1.formatAddressDisplayValue)(value, options);
    }
    // 3. 尝试从 options 查找
    if (options) {
        const searchValue = (0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType) ? (0, employee_select_display_utils_1.extractEmployeeId)(value) : value;
        const label = findLabelInOptions(searchValue, options, columnType);
        if (label)
            return label;
    }
    // 4. 员工选择器：从对象提取 nickName
    if ((0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType)) {
        return (0, employee_select_display_utils_1.extractEmployeeLabel)(value);
    }
    // 5. 回退到基础格式化
    return valueToString(value);
}
/**
 * 从 formMap缓存 中获取字段的显示值
 * @param value - 字段值
 * @param fieldKey - 字段 key
 * @param formMapRef - formMap 引用
 * @param fieldConfig - 字段配置（可选，用于获取 columnType）
 * @returns 格式化后的显示值
 */
function getDisplayValueFromFormMap(value, fieldKey, formMapRef, fieldConfig) {
    var _a;
    const formMapData = (_a = formMapRef === null || formMapRef === void 0 ? void 0 : formMapRef.current) === null || _a === void 0 ? void 0 : _a[fieldKey];
    // 优先使用 formMap 中的 columnType，如果没有则从 fieldConfig 中获取
    const columnType = (formMapData === null || formMapData === void 0 ? void 0 : formMapData.columnType) || (fieldConfig === null || fieldConfig === void 0 ? void 0 : fieldConfig['x-component']);
    // 对于时间选择器，无论是否有 options，都需要格式化时间戳
    // 因为 formatResult 可能在 formMap 初始化之前被调用
    if ((0, datetime_picker_display_utils_1.isTimePickerType)(columnType)) {
        const formattedArray = (0, datetime_picker_display_utils_1.formatTimestampToTimeStringArray)(value);
        if (formattedArray.length > 0 && formattedArray[0] !== '') {
            return formattedArray.join(', ');
        }
    }
    // 对于日期选择器，无论是否有 options，都需要格式化时间戳
    // 因为 formatResult 可能在 formMap 初始化之前被调用
    if ((0, datetime_picker_display_utils_1.isDatePickerType)(columnType)) {
        const formattedArray = (0, datetime_picker_display_utils_1.formatTimestampToDateStringArray)(value);
        if (formattedArray.length > 0 && formattedArray[0] !== '') {
            return formattedArray.join(', ');
        }
    }
    // 时区日期选择器：value 为 { zoneId, timestamp } 或该结构数组
    if ((0, datetime_picker_display_utils_1.isTimeZoneDatePickerType)(columnType)) {
        const str = (0, datetime_picker_display_utils_1.formatTimeZoneDateToDisplayString)(value);
        // 无论返回空字符串还是有值，都直接返回，避免显示 [object Object]
        return str;
    }
    // 地址类型组件：从 options 中查找 label
    if ((0, address_display_utils_1.isAddressType)(columnType)) {
        const options = formMapData === null || formMapData === void 0 ? void 0 : formMapData.options;
        return (0, address_display_utils_1.formatAddressDisplayValue)(value, options);
    }
    // 数值型组件：仅显示有效数值，非数字不显示（Tag 与「已为您查询」一致）
    if ((0, common_query_display_utils_1.isNumericColumnType)(columnType)) {
        const valid = (0, common_query_display_utils_1.getValidNumericForDisplay)(value);
        if (valid === undefined) {
            return '';
        }
        if (Array.isArray(valid)) {
            return valid.join(', ');
        }
        return String(valid);
    }
    if (!(formMapData === null || formMapData === void 0 ? void 0 : formMapData.options)) {
        // 如果没有 options，直接返回 value
        return valueToString(value);
    }
    const { options } = formMapData;
    // 处理数组值（多选）
    if (Array.isArray(value)) {
        const labels = value.map((v) => formatSingleValue(v, options, columnType));
        return labels.join(', ');
    }
    // 处理单值
    return formatSingleValue(value, options, columnType);
}
/**
 * 将 options 增量合并到 formMap
 * @param fieldKey - 字段 key
 * @param options - 要合并的 options 数组
 * @param formMapRef - formMap 引用
 * @param onFormMapUpdate - 更新 formMap 的回调
 * @param columnType - 组件类型
 * @param currentValue - 当前值（用于同步更新 labels 和 values）
 */
function mergeOptionsToFormMap(fieldKey, options, formMapRef, onFormMapUpdate, columnType, currentValue) {
    var _a;
    if (!options || !Array.isArray(options) || options.length === 0 || !onFormMapUpdate) {
        return;
    }
    const existingData = (_a = formMapRef === null || formMapRef === void 0 ? void 0 : formMapRef.current) === null || _a === void 0 ? void 0 : _a[fieldKey];
    const existingOptions = (existingData === null || existingData === void 0 ? void 0 : existingData.options) || [];
    // 增量合并 options（去重）
    const mergedOptions = [...existingOptions];
    options.forEach((newOpt) => {
        if (!mergedOptions.find((opt) => opt.value === newOpt.value)) {
            mergedOptions.push(newOpt);
        }
    });
    // 如果传入了 currentValue，同步更新 labels 和 values
    let labels = (existingData === null || existingData === void 0 ? void 0 : existingData.labels) || [];
    let values = (existingData === null || existingData === void 0 ? void 0 : existingData.values) || [];
    if (currentValue !== undefined) {
        // 处理数组值（多选）
        if (Array.isArray(currentValue)) {
            values = currentValue.map((v) => (0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType) ? (0, employee_select_display_utils_1.extractEmployeeId)(v) : v);
            labels = currentValue.map((v) => formatSingleValue(v, mergedOptions, columnType));
        }
        else {
            // 处理单值
            const searchValue = (0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType)
                ? (0, employee_select_display_utils_1.extractEmployeeId)(currentValue)
                : currentValue;
            values = [searchValue];
            labels = [formatSingleValue(currentValue, mergedOptions, columnType)];
        }
    }
    // 更新 formMap
    const updatedData = {
        labels,
        values,
        options: mergedOptions,
        columnType: columnType || (existingData === null || existingData === void 0 ? void 0 : existingData.columnType), // 保留现有的 columnType 或使用新的
    };
    onFormMapUpdate(fieldKey, updatedData);
}
