/**
 * Token 处理工具函数（通用）
 */
import { createFieldTagSlotConfig } from './create-field-tag-config';
import { getDisplayLabelFromOptions } from './display/common-query-display-utils';
import { filterSelectedOptions } from './build-selected-options';
import { isDatePickerType } from './display/datetime-picker-display-utils';
import { filterValueForGetList } from './filter-payload-for-get-list';
import { isNumericColumnType, filterValueForNumericColumn } from './numeric-column-value';
/**
 * 从 schema 中按字段路径读取字段配置。
 * 兼容平铺字段与 `properties` 嵌套结构，适配 lookup 注入后的 joinTableParams 路径字段。
 *
 * @param schema 字段 schema 集合
 * @param columnName 字段名或点路径
 * @returns 对应字段配置，未命中返回 undefined
 */
function getSchemaFieldConfig(schema, columnName) {
    if (!schema || !columnName)
        return undefined;
    if (schema[columnName])
        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);
}
/**
 * 将 tokens 转换为 slotConfigs 和 displayTexts
 * @param tokens - token 数组
 * @param schema - 字段配置 schema
 * @param customRenderForTag - 自定义 tag 渲染函数
 * @returns slotConfigs 和 displayTexts
 */
export function convertTokensToSlotConfigs(tokens, schema, customRenderForTag) {
    const slotConfigs = [];
    const displayTexts = [];
    tokens.forEach((token) => {
        var _a;
        if (token.queryType === 'NATURAL_LANGUAGE' && token.naturalLanguage) {
            // 自然语言：插入纯文本
            slotConfigs.push({
                type: 'text',
                value: token.naturalLanguage,
            });
            displayTexts.push(token.naturalLanguage);
        }
        else if (token.queryType === 'STRUCTURED' && token.columnName && token.value !== undefined) {
            // 结构化：根据 columnName 从 schema 中获取 fieldConfig
            const fieldConfig = getSchemaFieldConfig(schema, token.columnName);
            if (fieldConfig) {
                // 日期快捷选项：优先使用 _originalDateShortcutValue（原始值），否则使用 naturalLanguage
                let tagInitialValue = token.value;
                if (isDatePickerType(token.columnType)) {
                    // 对于日期范围选项，优先使用原始值（开始日期至结束日期:YYYY-MM-DD,YYYY-MM-DD）
                    if (token._originalDateShortcutValue) {
                        tagInitialValue = token._originalDateShortcutValue;
                    }
                    else if (token.naturalLanguage) {
                        tagInitialValue = token.naturalLanguage;
                    }
                }
                else if (isNumericColumnType(token.columnType)) {
                    // 数值型：只把有效数值传给组件，非法值（如后端误返 label）传 undefined，组件显示为空
                    const valid = filterValueForNumericColumn(token.value);
                    tagInitialValue = valid === undefined ? undefined : valid;
                }
                const tagConfig = createFieldTagSlotConfig(token.columnName, fieldConfig, customRenderForTag, tagInitialValue, token.options);
                slotConfigs.push(tagConfig);
                // 构建显示文本，用于显示在「已为您查询xxx」
                const fieldTitle = token.displayName || fieldConfig.title || token.columnName;
                const format = (_a = fieldConfig['x-component-props']) === null || _a === void 0 ? void 0 : _a.format;
                const displayValue = getDisplayLabelFromOptions(token.value, token.options, token.columnType, token.naturalLanguage, format);
                displayTexts.push(`${fieldTitle}: ${displayValue}`);
            }
            else {
                // 如果找不到 fieldConfig，回退到基础格式化
                const displayValue = getDisplayLabelFromOptions(token.value, token.options, token.columnType, token.naturalLanguage);
                slotConfigs.push({
                    type: 'text',
                    value: `${token.displayName}: ${displayValue}`,
                });
                displayTexts.push(`${token.displayName}: ${displayValue}`);
            }
        }
    });
    return { slotConfigs, displayTexts };
}
/**
 * 将 tokens 数组转换为搜索参数对象
 * @param tokens - token 数组（已经过 normalize 处理）
 * @returns 搜索参数对象 { columnName: value }
 */
export function tokensToSearchParams(tokens) {
    const searchParams = {};
    tokens
        .filter((token) => token.queryType === 'STRUCTURED')
        .forEach((token) => {
        if (!token.columnName || token.value === undefined)
            return;
        const finalValue = filterValueForGetList(token.columnType, token.value);
        if (finalValue === undefined)
            return;
        searchParams[token.columnName] = finalValue;
    });
    return searchParams;
}
/**
 * 处理 token 的 options：只保留选中项
 * 用于常用查询条件场景
 * 无论是远程还是非远程数据源，都只保留选中项
 * @param token - token 对象
 * @returns 处理后的 token
 */
export function processTokenOptions(token) {
    // 非结构化查询或无 options，直接返回
    if (token.queryType !== 'STRUCTURED' || !token.options || token.options.length === 0) {
        return token;
    }
    // 只保留选中项
    const selectedValues = Array.isArray(token.value) ? token.value : [token.value];
    const filteredOptions = filterSelectedOptions(token.options, selectedValues);
    return {
        ...token,
        options: filteredOptions,
    };
}
