"use strict";
/**
 * 数据转换工具：将内部 token 格式转换为后端 API 需要的格式
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.convertInternalTokensToApiTokens = convertInternalTokensToApiTokens;
const date_shortcuts_1 = require("../../utils/constants/date-shortcuts");
const datetime_picker_display_utils_1 = require("../../utils/display/datetime-picker-display-utils");
/**
 * 根据字段名从 schema 中读取字段配置，兼容：
 * 1) 平铺字段：`schema[columnName]`
 * 2) 嵌套字段：`schema.properties.xxx.properties.yyy`
 *
 * @param schema schema 节点（通常为 `schema.properties`）
 * @param columnName 字段路径（可能是点路径）
 * @returns 命中的字段配置；未命中返回 undefined
 */
function getSchemaFieldConfig(schema, columnName) {
    if (!schema || !columnName)
        return undefined;
    if (schema[columnName] !== undefined)
        return schema[columnName];
    return columnName.split('.').reduce((acc, key) => {
        if (!acc || typeof acc !== 'object')
            return undefined;
        if (acc[key] !== undefined)
            return acc[key];
        if (acc.properties && acc.properties[key] !== undefined)
            return acc.properties[key];
        return undefined;
    }, schema);
}
/**
 * 将内部 token 格式转换为 API token 格式
 * @param internalTokens - 内部 token 列表
 * @param naturalLanguage - 自然语言输入（可选）
 * @param schema - Formily schema 配置，用于获取正确的 columnType
 * @returns API token 数组
 */
function convertInternalTokensToApiTokens(internalTokens, naturalLanguage, schema) {
    const tokens = [];
    // 处理内部 tokens：先确定 queryType，然后根据 queryType 分别处理
    internalTokens.forEach((token) => {
        var _a, _b, _c;
        // 确定 queryType：TAG_PANEL 为 STRUCTURED，USER_ACTIVE_INPUT 为 NATURAL_LANGUAGE
        let queryType = null;
        if (token.tokenSourceEnum === 'TAG_PANEL' && token.dataBaseName) {
            queryType = 'STRUCTURED';
        }
        if (token.tokenSourceEnum === 'USER_ACTIVE_INPUT' && ((_a = token.values) === null || _a === void 0 ? void 0 : _a[0])) {
            queryType = 'NATURAL_LANGUAGE';
        }
        if (queryType === 'STRUCTURED') {
            // 结构化查询：从 schema 中获取正确的 columnType
            const fieldConfig = getSchemaFieldConfig(schema, token.dataBaseName);
            const columnType = (fieldConfig === null || fieldConfig === void 0 ? void 0 : fieldConfig['x-component']) || token.columnType || 'Input';
            // 提取 value：优先使用 dataBaseValues（实际值），如果没有则使用 values（显示值）
            // 统一返回数组格式（支持多选）
            let tokenValue;
            const sourceValues = (_b = token.dataBaseValues) !== null && _b !== void 0 ? _b : token.values;
            if (Array.isArray(sourceValues)) {
                tokenValue = sourceValues;
            }
            if (!Array.isArray(sourceValues) && sourceValues !== undefined) {
                tokenValue = [sourceValues];
            }
            const isRangePicker = columnType === 'RangePicker' || columnType === 'CnRangeDatePickerPro';
            const firstValue = Array.isArray(tokenValue) ? tokenValue[0] : tokenValue;
            const valueType = isRangePicker && typeof firstValue === 'string' ? (0, date_shortcuts_1.getDateFilterValueType)(firstValue) : null;
            const baseToken = {
                queryType: 'STRUCTURED',
                analyzeType: token.analyzeType || 'FILTER',
                opKind: token.opKind || 'EQ',
                displayName: token.name || '',
                columnName: token.dataBaseName,
                columnType,
                options: token.options,
            };
            if (valueType === 'shortcut' || valueType === 'dynamic' || valueType === 'dateRange') {
                let displayLabel;
                if (valueType === 'shortcut') {
                    displayLabel = (0, date_shortcuts_1.getDateShortcutLabel)(firstValue);
                }
                else if (valueType === 'dynamic') {
                    displayLabel = (0, datetime_picker_display_utils_1.parseDynamicDateOption)(firstValue) || '';
                }
                else {
                    const labels = (0, datetime_picker_display_utils_1.formatTimestampToDateStringArray)(firstValue);
                    displayLabel = (_c = labels[0]) !== null && _c !== void 0 ? _c : firstValue;
                }
                tokens.push({ ...baseToken, value: [], naturalLanguage: displayLabel });
            }
            else {
                tokens.push({ ...baseToken, value: tokenValue });
            }
        }
        if (queryType === 'NATURAL_LANGUAGE') {
            // 自然语言查询
            tokens.push({
                queryType: 'NATURAL_LANGUAGE',
                naturalLanguage: token.values[0],
            });
        }
    });
    return tokens;
}
