"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FilterConditionValueInput = FilterConditionValueInput;
const i18n_1 = __importDefault(require("../../../../../../locales/i18n.js"));
const react_1 = __importDefault(require("react"));
const cn_ui_1 = require("@cainiaofe/cn-ui");
const dayjs_1 = __importDefault(require("dayjs"));
const AiFilterDateValueInput_1 = require("../../../../../../cn-ai-filter/view/components/AiFilterDateValueInput");
const date_shortcuts_1 = require("../../../../../../cn-ai-filter/utils/constants/date-shortcuts");
const component_types_1 = require("../../../../../../cn-ai-table/view/constants/component-types");
const employee_filter_utils_1 = require("../../../../../../cn-ai-table/view/components/views/table-view/utils/filters/employee-filter-utils");
/**
 * AiFilterDateValueInput 中文值 → 表格筛选英文值的映射
 */
const ZH_TO_EN_MAP = {
    今天: 'today',
    明天: 'tomorrow',
    昨天: 'yesterday',
    本周: 'thisWeek',
    上周: 'lastWeek',
    下周: 'nextWeek',
    本月: 'thisMonth',
    上个月: 'lastMonth',
    下个月: 'nextMonth',
    今年: 'thisYear',
    去年: 'lastYear',
    明年: 'nextYear',
};
const EN_TO_ZH_MAP = Object.fromEntries(Object.entries(ZH_TO_EN_MAP).map(([zh, en]) => [en, zh]));
function convertZhValueToEn(zhValue) {
    if (!zhValue)
        return '';
    if (ZH_TO_EN_MAP[zhValue])
        return ZH_TO_EN_MAP[zhValue];
    if (zhValue.startsWith('未来:')) {
        const days = zhValue.replace(i18n_1.default.get({ id: 'Future.br5Zn', dm: '未来:' }), '');
        return `nextDays:${days}`;
    }
    if (zhValue.startsWith('过去:')) {
        const days = zhValue.replace(i18n_1.default.get({ id: 'Past.4YwvV', dm: '过去:' }), '');
        return `pastDays:${days}`;
    }
    if (zhValue.startsWith(`${date_shortcuts_1.DATE_RANGE_OPTION}:`)) {
        const rangeStr = zhValue.replace(`${date_shortcuts_1.DATE_RANGE_OPTION}:`, '');
        return `dateRange:${rangeStr}`;
    }
    return zhValue;
}
function convertEnValueToZh(enValue) {
    if (!enValue)
        return '';
    if (EN_TO_ZH_MAP[enValue])
        return EN_TO_ZH_MAP[enValue];
    if (enValue.startsWith('nextDays:')) {
        const days = enValue.replace('nextDays:', '');
        return i18n_1.default.get({
            id: 'Futuredays',
            dm: '未来:{days}',
        }, { days });
    }
    if (enValue.startsWith('pastDays:')) {
        const days = enValue.replace('pastDays:', '');
        return i18n_1.default.get({
            id: 'Pastdays',
            dm: '过去:{days}',
        }, { days });
    }
    if (enValue.startsWith('dateRange:')) {
        const rangeStr = enValue.replace('dateRange:', '');
        return `${date_shortcuts_1.DATE_RANGE_OPTION}:${rangeStr}`;
    }
    return enValue;
}
/**
 * 公共组件样式
 */
const COMMON_STYLE = { width: '200px' };
const COMMON_CLASS_NAME = 'value-input';
/**
 * 转换 requestConfig，将 params 转换为 data（请求 body）
 */
const transformRequestConfig = (requestConfig) => {
    if (!requestConfig)
        return undefined;
    const { params, ...restRequestConfig } = requestConfig;
    // 将 params 数组转换为 data 对象
    // params: [{label: "code", value: "CascaderSelect_1"}] => data: {code: "CascaderSelect_1"}
    if (params && Array.isArray(params) && params.length > 0) {
        const data = {};
        params.forEach((param) => {
            if (param.label && param.value !== undefined) {
                data[param.label] = param.value;
            }
        });
        return {
            ...restRequestConfig,
            data,
        };
    }
    return restRequestConfig;
};
/**
 * 获取字段的枚举选项
 */
const getFieldEnumOptions = (fieldMap, fieldId) => {
    const field = fieldMap[fieldId];
    if (!field) {
        return [];
    }
    const componentType = getFieldComponentType(fieldMap, fieldId);
    // Switch / CnSwitch 组件手动设置枚举值
    if (componentType === 'Switch' || componentType === 'CnSwitch') {
        return [
            { label: i18n_1.default.get({ id: 'Yes', dm: '是' }), value: 'true' },
            { label: i18n_1.default.get({ id: 'No', dm: '否' }), value: 'false' },
        ];
    }
    // 检查 x-component-props.dataSource（源码场景：RadioGroup/CnRadioGroup/CheckboxGroup 等直接在 props 中配置静态选项）
    const componentPropsForEnumFetch = (field === null || field === void 0 ? void 0 : field['x-component-props']) || {};
    if (Array.isArray(componentPropsForEnumFetch.dataSource) &&
        componentPropsForEnumFetch.dataSource.length > 0) {
        return componentPropsForEnumFetch.dataSource;
    }
    // 其他字段使用原有的枚举值
    if (!field.enum || !Array.isArray(field.enum)) {
        return [];
    }
    return field === null || field === void 0 ? void 0 : field.enum;
};
/**
 * 获取字段的组件类型
 */
const getFieldComponentType = (fieldMap, fieldId) => {
    const field = fieldMap[fieldId];
    return (field === null || field === void 0 ? void 0 : field['x-component']) || 'Input';
};
/**
 * 判断字段是否有枚举值
 */
const hasEnumOptions = (fieldMap, fieldId) => {
    const field = fieldMap[fieldId];
    if (!field) {
        return false;
    }
    const componentType = getFieldComponentType(fieldMap, fieldId);
    // Switch / CnSwitch 组件始终有枚举值
    if (componentType === 'Switch' || componentType === 'CnSwitch') {
        return true;
    }
    // 检查 x-component-props.dataSource（源码场景：RadioGroup/CnRadioGroup/CheckboxGroup 等直接在 props 中配置静态选项）
    const componentPropsForEnum = (field === null || field === void 0 ? void 0 : field['x-component-props']) || {};
    if (Array.isArray(componentPropsForEnum.dataSource) &&
        componentPropsForEnum.dataSource.length > 0) {
        return true;
    }
    // 其他字段检查是否有枚举值
    return Boolean((field === null || field === void 0 ? void 0 : field.enum) && Array.isArray(field.enum) && field.enum.length > 0);
};
/**
 * 判断字段是否需要从 field.enum 注入静态选项
 * 1. formily schema 中 dataOrigin === 'static' 的选项存储在 field.enum 而非 x-component-props.dataSource
 * 2. 无 dataSource 且无 requestConfig 但有 enum 的字段（如源码场景直接配置 enum 的 CnAsyncSelect）
 */
const needsStaticEnumInjection = (componentProps, field) => !componentProps.dataSource &&
    Array.isArray(field === null || field === void 0 ? void 0 : field.enum) &&
    field.enum.length > 0 &&
    (componentProps.dataOrigin === 'static' || !componentProps.requestConfig);
/**
 * 获取字段的组件属性
 * 当 dataOrigin === 'static' 且 field.enum 存在时，自动将 enum 注入为 dataSource，
 * 解决 formily schema 中静态选项存储在 field.enum（而非 x-component-props.dataSource）导致的无选项问题
 */
const getFieldComponentProps = (fieldMap, fieldId) => {
    const field = fieldMap[fieldId];
    const componentProps = (field === null || field === void 0 ? void 0 : field['x-component-props']) || {};
    if (needsStaticEnumInjection(componentProps, field)) {
        return { ...componentProps, dataSource: field.enum };
    }
    return componentProps;
};
/**
 * 解析范围值（日期区间或时间区间）
 */
const parseRangeValue = (value) => {
    if (!value)
        return undefined;
    try {
        const parsed = JSON.parse(value);
        if (Array.isArray(parsed) && parsed.length === 2) {
            const [start, end] = parsed;
            if (typeof start === 'number' && typeof end === 'number') {
                return [start, end];
            }
        }
    }
    catch {
        // 如果不是 JSON 格式，尝试解析为单个时间戳
        const numValue = Number(value);
        if (!isNaN(numValue) && String(numValue) === value) {
            return [numValue, numValue];
        }
    }
    return undefined;
};
/**
 * 解析时间值
 */
const parseTimeValue = (value) => {
    if (!value)
        return undefined;
    const numValue = Number(value);
    if (!isNaN(numValue) && String(numValue) === value) {
        return numValue;
    }
    // 如果是时间字符串格式（如 "17:59:44"），解析为时间戳
    const today = (0, dayjs_1.default)().format('YYYY-MM-DD');
    const parsed = (0, dayjs_1.default)(`${today} ${value}`);
    return parsed.isValid() ? parsed.valueOf() : undefined;
};
/**
 * 渲染需要 requestConfig 转换的选择组件
 * 传入 fieldId 作为 key，确保字段切换时组件重新挂载并重新发起请求
 */
const renderSelectComponentWithRequestConfig = (Component, componentProps, value, onChange, placeholder, className, fieldId) => {
    // useDetailValue 不适用于筛选值输入框：组件返回 object 值导致 String() 拍平为 "[object Object]"，
    // 既无法回显也无法匹配。筛选只需存原始值，行值 object 由 normalizeDetailValue 归一化处理。
    const { requestConfig, useDetailValue: _useDetailValue, ...restProps } = componentProps;
    const transformedRequestConfig = transformRequestConfig(requestConfig);
    // 多选模式下 value 必须为数组，否则 handleTagClose 调用 .filter() 会报错
    const isMultiple = restProps.mode === 'multiple';
    const displayValue = isMultiple ? value.split(',').filter(Boolean) : value;
    return (react_1.default.createElement(Component, { key: fieldId, ...restProps, ...(transformedRequestConfig && { requestConfig: transformedRequestConfig }), value: displayValue, onChange: (val) => {
            if (isMultiple && Array.isArray(val)) {
                onChange(val.join(','));
            }
            else if (typeof val === 'object' && val !== null) {
                // 若组件返回 object，提取 .value 字段
                onChange(val.value != null ? String(val.value) : '');
            }
            else {
                onChange(val != null ? String(val) : '');
            }
        }, placeholder: placeholder, className: className, style: COMMON_STYLE, hasClear: true }));
};
/**
 * 人员、部门、地址
 */
const renderStandardSelectComponent = (Component, componentProps, value, onChange, placeholder, className, isEmployeeSelect = false) => {
    return (react_1.default.createElement(Component, { ...componentProps, value: value, onChange: (val) => {
            if (isEmployeeSelect) {
                // 人员选择器：提取 workNo，用逗号连接
                const workNos = (0, employee_filter_utils_1.extractEmployeeWorkNos)(val);
                onChange(workNos.join(','));
            }
            else {
                // 其他组件：直接转换为字符串
                onChange(val !== undefined && val !== null ? String(val) : '');
            }
        }, placeholder: placeholder, className: className, style: COMMON_STYLE, hasClear: true }));
};
/**
 * 筛选条件的值输入组件
 * 根据字段类型动态选择输入组件
 */
function FilterConditionValueInput({ fieldId, operator, value, onChange, fieldMap, }) {
    var _a, _b, _c, _d;
    // empty 和 notEmpty 操作符不需要值输入
    if (operator === 'empty' || operator === 'notEmpty') {
        return (react_1.default.createElement(cn_ui_1.CnInput, { value: "", disabled: true, placeholder: i18n_1.default.get({ id: 'NoNeedToEnterValues', dm: '无需输入值' }), className: COMMON_CLASS_NAME, style: COMMON_STYLE }));
    }
    // 如果没有选择字段，使用普通输入框
    if (!fieldId) {
        return (react_1.default.createElement(cn_ui_1.CnInput, { value: value, onChange: onChange, placeholder: i18n_1.default.get({ id: 'InputValue', dm: '输入值' }), hasClear: true, className: COMMON_CLASS_NAME, style: COMMON_STYLE }));
    }
    const componentType = getFieldComponentType(fieldMap, fieldId);
    const componentProps = getFieldComponentProps(fieldMap, fieldId);
    // 日期类型（单选/区间），使用自定义日期筛选组件
    if (component_types_1.DATE_PICKER_COMPONENT_TYPES.includes(componentType) ||
        component_types_1.RANGE_DATE_PICKER_COMPONENT_TYPES.includes(componentType)) {
        return (react_1.default.createElement(AiFilterDateValueInput_1.AiFilterDateValueInput, { value: convertEnValueToZh(value), onChange: (zhVal) => onChange(convertZhValueToEn(zhVal)) }));
    }
    // 时间选择类型，使用组件本身
    if (component_types_1.TIME_PICKER_COMPONENT_TYPES.includes(componentType)) {
        // TimePicker / CnTimePickerPro：单个时间选择器
        if (componentType === 'TimePicker' || componentType === 'CnTimePickerPro') {
            const timeValue = parseTimeValue(value);
            return (react_1.default.createElement(cn_ui_1.CnTimePickerPro, { ...componentProps, value: timeValue, onChange: (val) => {
                    onChange(val !== undefined && val !== null ? String(val) : '');
                }, placeholder: i18n_1.default.get({ id: 'SelectTime', dm: '选择时间' }), className: COMMON_CLASS_NAME, style: COMMON_STYLE, hasClear: true }));
        }
        // RangeTimePicker / CnRangeTimePickerPro：时间区间选择器
        if (componentType === 'RangeTimePicker' || componentType === 'CnRangeTimePickerPro') {
            const rangeValue = parseRangeValue(value);
            return (react_1.default.createElement(cn_ui_1.CnRangeTimePickerPro, { ...componentProps, value: rangeValue, onChange: (val) => {
                    if (Array.isArray(val) && val.length === 2) {
                        onChange(JSON.stringify(val));
                    }
                    else {
                        onChange('');
                    }
                }, placeholder: i18n_1.default.get({ id: 'SelectTimeInterval', dm: '选择时间区间' }), className: COMMON_CLASS_NAME, style: COMMON_STYLE, hasClear: true }));
        }
    }
    // 数值、评分、进度类型，统一使用 CnNumberPicker
    if (component_types_1.NUMBER_COMPONENT_TYPES.includes(componentType)) {
        return (react_1.default.createElement(cn_ui_1.CnNumberPicker, { ...componentProps, value: value ? Number(value) : undefined, onChange: (val) => onChange(val !== undefined && val !== null ? String(val) : ''), placeholder: i18n_1.default.get({ id: 'EnterNumericValues', dm: '输入数值' }), className: COMMON_CLASS_NAME, style: COMMON_STYLE, hasClear: true }));
    }
    // 树选择类型，使用 CnTreeSelect
    if (component_types_1.TREE_SELECT_COMPONENT_TYPES.includes(componentType)) {
        return renderSelectComponentWithRequestConfig(cn_ui_1.CnTreeSelect, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectValue', dm: '选择值' }), 'value-input', fieldId);
    }
    // 级联选择类型，使用 CnCascaderSelect
    if (component_types_1.CASCADER_SELECT_COMPONENT_TYPES.includes(componentType)) {
        return renderSelectComponentWithRequestConfig(cn_ui_1.CnCascaderSelect, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectValue', dm: '选择值' }), 'value-input', fieldId);
    }
    // 下拉选择类型，使用 CnAsyncSelect
    if (component_types_1.SELECT_COMPONENT_TYPES.includes(componentType)) {
        return renderSelectComponentWithRequestConfig(cn_ui_1.CnAsyncSelect, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectValue', dm: '选择值' }), 'value-input', fieldId);
    }
    // 人员选择类型，使用 CnEmployeeSelect
    if (component_types_1.EMPLOYEE_SELECT_COMPONENT_TYPES.includes(componentType)) {
        return renderStandardSelectComponent(cn_ui_1.CnEmployeeSelect, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectPersonnel', dm: '选择人员' }), 'value-input', true);
    }
    // 部门选择类型，使用 CnDepartmentSelect
    if (component_types_1.DEPARTMENT_SELECT_COMPONENT_TYPES.includes(componentType)) {
        return renderStandardSelectComponent(cn_ui_1.CnDepartmentSelect, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectDepartment', dm: '选择部门' }), 'value-input');
    }
    // 地址选择类型，使用 CnAddress
    if (component_types_1.ADDRESS_SELECT_COMPONENT_TYPES.includes(componentType)) {
        const CnAddress = (_d = (_c = (_b = (_a = window === null || window === void 0 ? void 0 : window.cnLowCodeUtils) === null || _a === void 0 ? void 0 : _a.filterItem) === null || _b === void 0 ? void 0 : _b.getRunTimeItem) === null || _c === void 0 ? void 0 : _c.call(_b, 'AddressSelect')) === null || _d === void 0 ? void 0 : _d.component;
        if (!CnAddress) {
            // 非低码运行环境中地址组件不可用，降级为文本框
            return (react_1.default.createElement(cn_ui_1.CnInput, { value: value, onChange: onChange, placeholder: i18n_1.default.get({ id: 'SelectAddress', dm: '选择地址' }), hasClear: true, className: COMMON_CLASS_NAME, style: COMMON_STYLE }));
        }
        return renderStandardSelectComponent(CnAddress, componentProps, value, onChange, i18n_1.default.get({ id: 'SelectAddress', dm: '选择地址' }), 'value-input');
    }
    // 其他有枚举值的字段，统一使用 CnAsyncSelect（扁平结构，支持多选）
    if (hasEnumOptions(fieldMap, fieldId)) {
        const enumOptions = getFieldEnumOptions(fieldMap, fieldId);
        // 将逗号分隔的字符串转换为数组
        const selectValue = value ? value.split(',').filter(Boolean) : undefined;
        return (react_1.default.createElement(cn_ui_1.CnAsyncSelect, { dataSource: enumOptions, value: selectValue, onChange: (val) => {
                // 多选模式下，val 是数组，转换为逗号分隔的字符串
                if (Array.isArray(val)) {
                    onChange(val.join(','));
                }
                else {
                    onChange(val ? String(val) : '');
                }
            }, placeholder: i18n_1.default.get({ id: 'SelectValue', dm: '选择值' }), className: COMMON_CLASS_NAME, style: COMMON_STYLE, hasClear: true, mode: "multiple" }));
    }
    // 没有枚举值的字段，使用普通输入框
    return (react_1.default.createElement(cn_ui_1.CnInput, { value: value, onChange: onChange, placeholder: i18n_1.default.get({ id: 'InputValue', dm: '输入值' }), hasClear: true, className: COMMON_CLASS_NAME, style: COMMON_STYLE }));
}
