"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.FieldTagPopupWrapper = void 0;
const i18n_1 = __importDefault(require("../locales/i18n.js"));
const React = __importStar(require("react"));
const context_1 = require("../cn-sender/view/context");
const components_1 = require("../cn-ai-filter/view/components");
const form_map_display_utils_1 = require("../cn-ai-filter/utils/display/form-map-display-utils");
const datetime_picker_display_utils_1 = require("../cn-ai-filter/utils/display/datetime-picker-display-utils");
const date_shortcuts_1 = require("../cn-ai-filter/utils/constants/date-shortcuts");
const address_display_utils_1 = require("../cn-ai-filter/utils/display/address-display-utils");
/**
 * FieldTagPopupWrapper 组件，用于在 customRender 中访问 SlotTextArea 的上下文
 * 注意：这个组件在 SlotTextArea 的 renderSlot 中被调用，可以访问 SlotTextArea 的上下文
 * formMapRef 和 onFormMapUpdate 现在通过 customRender 的参数传递
 */
const FieldTagPopupWrapper = ({ value, onValueChange, renderProps, item, formMapRef, onFormMapUpdate }) => {
    var _a, _b, _c;
    // 从 SenderContext 中获取上下文
    const context = React.useContext(context_1.SenderContext);
    const { form, formProps, schema } = context;
    // 从 item.props 中获取 fieldConfig
    const config = (_a = item.props) === null || _a === void 0 ? void 0 : _a.fieldConfig;
    const title = (_b = item.props) === null || _b === void 0 ? void 0 : _b.fieldTitle;
    const fieldKey = item.key;
    const options = (_c = item.props) === null || _c === void 0 ? void 0 : _c.options;
    // 初始化 formMap（仅用于常用查询条件场景）
    //
    // 两种场景的区别：
    // 1. 常用查询条件面板：tag 直接从后端 tokens 转换，未经过 FieldInputForm，会传入 options 或 initialValue，需要手动初始化 formMap
    // 2. 正常查询按钮：tag 由用户通过 FieldInputForm 输入后转换，formMap 已通过 onChange 更新，不会传入 options，无需初始化
    //
    // 判断是否需要初始化：如果传入了 options，说明是常用查询条件场景（Select 等类型）
    // 或者如果 formMap 未初始化且有 value，也可能是常用查询条件场景（Input 类型）
    React.useEffect(() => {
        var _a, _b, _c, _d, _e;
        // 如果没有 formMapRef 或 onFormMapUpdate，无法初始化
        if (!formMapRef || !onFormMapUpdate || !fieldKey) {
            return;
        }
        // 如果传入了 options，说明是常用查询条件场景，需要初始化 formMap
        const hasOptions = options && Array.isArray(options) && options.length > 0;
        // 如果没有 options 但 formMap 已存在，说明是正常查询按钮场景，无需初始化
        const formMapExists = ((_c = (_b = (_a = formMapRef.current) === null || _a === void 0 ? void 0 : _a[fieldKey]) === null || _b === void 0 ? void 0 : _b.values) === null || _c === void 0 ? void 0 : _c.length) > 0;
        // 只有常用查询条件场景（有 options 或 formMap 未初始化）才需要初始化
        if (!hasOptions && formMapExists) {
            return;
        }
        // 检查是否已经初始化过（避免重复初始化）
        const existingData = (_d = formMapRef.current) === null || _d === void 0 ? void 0 : _d[fieldKey];
        if (existingData && existingData.values && existingData.values.length > 0) {
            return;
        }
        // 从 config 中获取 columnType (x-component)
        const columnType = config === null || config === void 0 ? void 0 : config['x-component'];
        // 日期类型不使用 mergeOptionsToFormMap（options 的 value 内容无法匹配时间戳），直接走日期格式化路径
        // 地址类型需要特殊处理，因为 value 可能是 code，需要从 options 中查找 label
        // 对于 Select 等下拉类型，才使用 mergeOptionsToFormMap
        if (options &&
            Array.isArray(options) &&
            options.length > 0 &&
            !(0, datetime_picker_display_utils_1.isDatePickerType)(columnType) &&
            !(0, address_display_utils_1.isAddressType)(columnType)) {
            (0, form_map_display_utils_1.mergeOptionsToFormMap)(fieldKey, options, formMapRef, onFormMapUpdate, columnType, value);
        }
        else if (value !== undefined && value !== null && value !== '') {
            // 如果没有 options 但有 value，手动初始化 formMap（适用于 Input 等输入类型）
            // Input 类型不需要 options，但仍需要初始化 labels 和 values，供 convertSlotConfigToInternalTokens 使用
            let values = Array.isArray(value) ? value : [value];
            let labels;
            if ((0, datetime_picker_display_utils_1.isTimePickerType)(columnType)) {
                // 对于时间选择器，格式化时间戳为时间字符串数组
                labels = (0, datetime_picker_display_utils_1.formatTimestampToTimeStringArray)(value);
            }
            else if ((0, datetime_picker_display_utils_1.isDatePickerType)(columnType)) {
                // 检查是否是日期范围选项格式（开始日期至结束日期:YYYY-MM-DD,YYYY-MM-DD）
                const isDateRangeOption = typeof value === 'string' && value.startsWith('开始日期至结束日期:');
                // 检查是否是日期快捷选项或动态日期选项
                const isDateShortcutValue = typeof value === 'string' && (0, date_shortcuts_1.isDateShortcut)(value);
                const isDynamicDateOption = typeof value === 'string' && (value.startsWith('未来:') || value.startsWith('过去:'));
                if (isDateRangeOption) {
                    // 日期范围选项：提取日期部分，只显示日期范围，不显示"开始日期至结束日期"前缀
                    const dateRangeStr = String(value).replace(i18n_1.default.get({ id: 'StartDateToEndDate.9VWkj', dm: '开始日期至结束日期:' }), '');
                    const [startDate, endDate] = dateRangeStr.split(',');
                    if (startDate && endDate) {
                        labels = [
                            i18n_1.default.get({
                                id: 'StartDateToEndDate.6tqtG',
                                dm: '{startDate} 至 {endDate}',
                            }, { startDate, endDate }),
                        ];
                    }
                    else {
                        labels = [String(value)];
                    }
                }
                else if (isDateShortcutValue) {
                    // 日期快捷选项：使用中文标签
                    labels = Array.isArray(value)
                        ? value.map((v) => ((0, date_shortcuts_1.isDateShortcut)(v) ? (0, date_shortcuts_1.getDateShortcutLabel)(v) : String(v)))
                        : [(0, date_shortcuts_1.getDateShortcutLabel)(value)];
                }
                else if (isDynamicDateOption) {
                    // 动态日期选项（未来:N、过去:N）：格式化为「未来 N 天内」「过去 N 天内」
                    const formatted = (0, datetime_picker_display_utils_1.parseDynamicDateOption)(String(value));
                    labels = formatted ? [formatted] : [String(value)];
                }
                else {
                    // 对于日期选择器，检查 formMap 中是否已有日期快捷选项值
                    const existingFormMapData = (_e = formMapRef === null || formMapRef === void 0 ? void 0 : formMapRef.current) === null || _e === void 0 ? void 0 : _e[fieldKey];
                    const existingValues = existingFormMapData === null || existingFormMapData === void 0 ? void 0 : existingFormMapData.values;
                    // 如果 formMap 中已有日期快捷选项值（如 "today"），且当前 value 是数组格式的日期时间值
                    // 说明后端返回了具体的日期时间值，但我们应该保持使用日期快捷选项值
                    if (existingValues && existingValues.length > 0) {
                        const firstExistingValue = Array.isArray(existingValues)
                            ? existingValues[0]
                            : existingValues;
                        if ((0, date_shortcuts_1.isDateShortcut)(firstExistingValue)) {
                            // 使用已有的日期快捷选项值
                            labels = (0, datetime_picker_display_utils_1.formatTimestampToDateStringArray)(firstExistingValue);
                            // 不更新 values，保持原有的日期快捷选项值
                            return; // 不更新 formMap，保持原有值
                        }
                    }
                    // 对于日期选择器，格式化时间戳为日期字符串数组
                    labels = (0, datetime_picker_display_utils_1.formatTimestampToDateStringArray)(value);
                }
            }
            else if ((0, datetime_picker_display_utils_1.isTimeZoneDatePickerType)(columnType)) {
                // 时区日期选择器：value 为 { zoneId, timestamp }
                const str = (0, datetime_picker_display_utils_1.formatTimeZoneDateToDisplayString)(value);
                // 如果格式化后为空字符串（没有时间戳），不初始化 formMap
                if (!str) {
                    return;
                }
                labels = [str];
            }
            else if ((0, address_display_utils_1.isAddressType)(columnType)) {
                // 地址类型组件：从 options 中查找 label，value 存储 code
                const addressOptions = options && Array.isArray(options) && options.length > 0 ? options : [];
                const formattedValue = (0, address_display_utils_1.formatAddressDisplayValue)(value, addressOptions);
                labels = formattedValue ? [formattedValue] : [];
                // 提取 code 值存储到 values
                values = Array.isArray(value)
                    ? value.map((v) => (0, address_display_utils_1.extractAddressCode)(v))
                    : [(0, address_display_utils_1.extractAddressCode)(value)];
            }
            else {
                // 非时间/日期选择器，直接转换为字符串
                labels = Array.isArray(value) ? value.map((v) => String(v)) : [String(value)];
            }
            const updatedData = {
                labels,
                values,
                // 地址类型需要保存 options，以便后续查找 label
                options: (0, address_display_utils_1.isAddressType)(columnType) && options && Array.isArray(options) ? options : [],
                columnType,
            };
            onFormMapUpdate(fieldKey, updatedData);
        }
    }, [fieldKey, options, formMapRef, onFormMapUpdate, config, value]);
    if (!config) {
        // 如果没有 fieldConfig，回退到默认显示
        return (React.createElement("span", { className: "cn-sender-slot-tag" }, title ? `${title}: ${value || ''}` : String(value || '')));
    }
    return (React.createElement(components_1.FieldTagPopup, { prefixCls: "cn-sender", tagKey: fieldKey || '', config: config, value: value, onValueChange: onValueChange, renderProps: renderProps, form: form, formProps: formProps, schema: schema, fieldKey: fieldKey, title: title, formMapRef: formMapRef, onFormMapUpdate: onFormMapUpdate }));
};
exports.FieldTagPopupWrapper = FieldTagPopupWrapper;
