"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isNumericColumnType = isNumericColumnType;
exports.getValidNumericForDisplay = getValidNumericForDisplay;
exports.getDisplayLabelFromOptions = getDisplayLabelFromOptions;
/**
 * Display 层：通用查询显示格式化工具
 * 条件查询列表显示
 * 已为您查询提示
 */
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");
// import type { FormilyFieldConfig } from '../../../cn-ai-table/types/formily-field-config';
/** 数值型组件：Tag 只应显示数值，后端误返 label（如「库存数量」）时显示「未填写」 */
const NUMERIC_COLUMN_TYPES = new Set([
    'NumberPicker',
    'CnNumberPicker',
    'Range',
    'CnRange',
    'Rating',
    'CnRating',
    'RangeNumberPicker',
]);
function isNumericColumnType(columnType) {
    return !!columnType && NUMERIC_COLUMN_TYPES.has(columnType);
}
/** 仅当 value 可解析为数字时返回数字/数字数组，否则返回 undefined（用于展示层判断是否显示「未填写」） */
function getValidNumericForDisplay(value) {
    if (value === null || value === undefined)
        return undefined;
    const toNumber = (v) => {
        if (typeof v === 'number' && !Number.isNaN(v))
            return v;
        if (typeof v === 'string') {
            const trimmed = v.trim();
            if (trimmed === '')
                return undefined;
            const n = Number(trimmed);
            return Number.isNaN(n) ? undefined : n;
        }
        return undefined;
    };
    if (Array.isArray(value)) {
        const numbers = value.map(toNumber).filter((n) => n !== undefined);
        if (numbers.length === 0)
            return undefined;
        return numbers.length === 1 ? numbers[0] : numbers;
    }
    const single = toNumber(value);
    return single === undefined ? undefined : single;
}
/**
 * 从 options 中获取显示 label
 * @param value - 字段值
 * @param options - 选项列表
 * @param columnType - 组件类型（如 EmployeeSelect）
 * @param naturalLanguage - 自然语言值（用于日期快捷选项）
 * @param format - 日期格式（优先使用用户配置的 format，默认为 "YYYY-MM-DD HH:mm:ss"）
 * @param fieldConfig - 字段配置（可选）
 */
function getDisplayLabelFromOptions(value, options, columnType, naturalLanguage, format) {
    // 1. 时间选择器：格式化时间戳
    if ((0, datetime_picker_display_utils_1.isTimePickerType)(columnType)) {
        return formatTimestampValueToString(value, datetime_picker_display_utils_1.formatTimestampToTimeStringArray);
    }
    // 2. 时区日期选择器：value 为 { zoneId, timestamp } 或该结构数组
    if ((0, datetime_picker_display_utils_1.isTimeZoneDatePickerType)(columnType)) {
        return (0, datetime_picker_display_utils_1.formatTimeZoneDateToDisplayString)(value);
    }
    // 3. 日期选择器：如果有 naturalLanguage（日期快捷选项），显示中文标签和具体日期时间值
    if ((0, datetime_picker_display_utils_1.isDatePickerType)(columnType)) {
        if (naturalLanguage) {
            // 所有日期选择器类型：显示"中文标签（具体日期时间值）"
            const dateTimeValue = (0, datetime_picker_display_utils_1.formatDateTimeValue)(value, format);
            if (dateTimeValue) {
                return `${naturalLanguage}（${dateTimeValue}）`;
            }
            return naturalLanguage;
        }
        // 普通日期选择器：格式化时间戳
        return formatTimestampValueToString(value, datetime_picker_display_utils_1.formatTimestampToDateStringArray);
    }
    // 4. 地址类型组件：从 options 中查找 label
    if ((0, address_display_utils_1.isAddressType)(columnType)) {
        return (0, address_display_utils_1.formatAddressDisplayValue)(value, options);
    }
    // 5. 人员选择器：特殊处理逻辑
    if ((0, employee_select_display_utils_1.isEmployeeSelectorType)(columnType)) {
        // 处理数组值（多选）
        if (Array.isArray(value)) {
            const labels = value.map((v) => {
                return (0, employee_select_display_utils_1.findEmployeeLabel)(v, options) || (0, employee_select_display_utils_1.extractEmployeeLabel)(v);
            });
            return labels.join(', ');
        }
        // 处理单值
        return (0, employee_select_display_utils_1.findEmployeeLabel)(value, options) || (0, employee_select_display_utils_1.extractEmployeeLabel)(value);
    }
    // 5.5 数值型组件（NumberPicker 等）：仅显示有效数值，后端误返 label（如「库存数量」）时不显示
    if (isNumericColumnType(columnType)) {
        const valid = getValidNumericForDisplay(value);
        if (valid === undefined) {
            return '';
        }
        if (Array.isArray(valid)) {
            return valid.join(', ');
        }
        return String(valid);
    }
    // 6. 没有 options：基础格式化
    // 对于Input、NumberPicker等类型，直接返回 value 的显示文本
    if (!options || !Array.isArray(options) || options.length === 0) {
        return formatValueWithoutOptions(value);
    }
    // 7. 有 options：从 options 中查找 label
    return formatValueWithOptions(value, options);
}
/**
 * 格式化时间戳值为显示文本（通用函数）
 * @param value - 时间戳值
 * @param formatFn - 格式化函数，将值转换为字符串数组
 */
function formatTimestampValueToString(value, formatFn) {
    const formattedArray = formatFn(value);
    // 过滤掉空字符串后连接（空数组 join 会返回空字符串）
    return formattedArray.filter((v) => v !== '').join(', ');
}
/**
 * 格式化没有 options 的值
 * 支持单值、数组、以及带 value 属性的对象
 */
function formatValueWithoutOptions(value) {
    var _a;
    if (Array.isArray(value)) {
        return value
            .map((v) => formatValueWithoutOptions(v))
            .filter(Boolean)
            .join(', ');
    }
    if (typeof value === 'object' && value !== null) {
        if ('value' in value) {
            return String((_a = value.value) !== null && _a !== void 0 ? _a : '');
        }
        // 避免显示 [object Object]
        return '';
    }
    return String(value !== null && value !== void 0 ? value : '');
}
/**
 * 格式化有 options 的值
 */
function formatValueWithOptions(value, options) {
    if (Array.isArray(value)) {
        // 多选：处理数组值
        const labels = value.map((v) => findLabelInOptions(v, options));
        return labels.join(', ');
    }
    // 单选：处理单值
    return findLabelInOptions(value, options);
}
/**
 * 从 options 中查找 label，支持对象和原始值
 */
function findLabelInOptions(value, options) {
    // 如果 value 是对象且有 label，直接使用
    if (typeof value === 'object' && value !== null && value.label) {
        return value.label;
    }
    // 提取用于匹配的 searchValue
    const searchValue = typeof value === 'object' && value !== null ? value.value : value;
    // 从 options 中查找
    const option = options.find((opt) => opt.value === searchValue);
    if (option === null || option === void 0 ? void 0 : option.label) {
        return option.label;
    }
    // 回退：从对象中提取或转换为字符串
    return formatValueWithoutOptions(value);
}
