import { handleDateFilter } from './date-filter-utils';
import { handleEmployeeSelectFilter } from './employee-filter-utils';
import { handleEmptyOperator } from './empty-filter-utils';
import { handleNumericComparison } from './numeric-filter-utils';
import { handleStringComparison } from './string-filter-utils';
import { NUMBER_COMPONENT_TYPES, DATE_TIME_COMPONENT_TYPES, EMPLOYEE_SELECT_COMPONENT_TYPES, } from '../../../../../../../cn-ai-table/view/constants/component-types';
/**
 * 根据组件类型判断比较方式（供 DataModel.applyFilters 等复用，保证任务视图/列表视图与表格视图筛选一致）
 */
export function getComparisonFlags(componentType) {
    if (!componentType) {
        return {
            isNumericComparison: false,
            isDateComparison: false,
            isEmployeeSelect: false,
        };
    }
    return {
        isNumericComparison: NUMBER_COMPONENT_TYPES.includes(componentType),
        isDateComparison: DATE_TIME_COMPONENT_TYPES.includes(componentType),
        isEmployeeSelect: EMPLOYEE_SELECT_COMPONENT_TYPES.includes(componentType),
    };
}
/**
 * 当字段启用 useDetailValue 时，行值为对象/对象数组。
 * - 员工/部门选择器类型：跳过归一化，保留原始对象供 handleEmployeeSelectFilter 处理
 * - 有 x-data.fieldKey：提取 obj[fieldKey]
 * - 无 x-data.fieldKey：默认提取 obj.value
 * - 对象数组：各元素提取后拼接为逗号字符串（兼容多选比较逻辑）
 */
export function normalizeDetailValue(rowValue, fieldSchema) {
    var _a, _b;
    const useDetailValue = ((_a = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-component-props']) === null || _a === void 0 ? void 0 : _a.useDetailValue) === true;
    if (!useDetailValue || rowValue === null || rowValue === undefined) {
        return rowValue;
    }
    // 员工/部门选择器由 handleEmployeeSelectFilter 处理，不做对象提取
    const componentType = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-component'];
    if (componentType &&
        EMPLOYEE_SELECT_COMPONENT_TYPES.includes(componentType)) {
        return rowValue;
    }
    // 有 x-data.fieldKey 就用指定 key，否则默认用 value
    const fieldKey = ((_b = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-data']) === null || _b === void 0 ? void 0 : _b.fieldKey) || 'value';
    if (Array.isArray(rowValue)) {
        const extracted = rowValue
            .map((item) => (typeof item === 'object' && item !== null ? item[fieldKey] : item))
            .filter((v) => v !== undefined && v !== null)
            .map(String);
        return extracted.join(',');
    }
    if (typeof rowValue === 'object') {
        return rowValue[fieldKey];
    }
    return rowValue;
}
/**
 * 根据 fieldMap + 字段 id 做一次筛选匹配（供 applyFiltersToData / 表格 customFilterFn 等复用）
 */
export function matchFilterConditionWithField(rowValue, operator, value, fieldMap, fieldId) {
    const fieldSchema = fieldMap === null || fieldMap === void 0 ? void 0 : fieldMap[fieldId];
    const componentType = fieldSchema === null || fieldSchema === void 0 ? void 0 : fieldSchema['x-component'];
    const { isNumericComparison, isDateComparison, isEmployeeSelect } = getComparisonFlags(componentType);
    // 当字段启用 useDetailValue 时，从 object 中提取 x-fieldKey 指定的真实比较值
    const normalizedRowValue = normalizeDetailValue(rowValue, fieldSchema);
    return matchFilterCondition(normalizedRowValue, operator, value, isNumericComparison, isDateComparison, isEmployeeSelect);
}
/**
 * 对数据应用筛选条件（纯函数，供 DataModel 及单测复用）
 * 与表格 customFilterFn 使用同一套比较逻辑，保证各视图筛选结果一致
 */
export function applyFiltersToData(data, filters, fieldMap) {
    if (!(filters === null || filters === void 0 ? void 0 : filters.length))
        return data;
    return data.filter((row) => filters.every((filter) => {
        if (!filter.field || !filter.operator)
            return true;
        const fieldValue = row[filter.field];
        return matchFilterConditionWithField(fieldValue, filter.operator, filter.value, fieldMap, filter.field);
    }));
}
/**
 * 核心筛选逻辑函数
 * 判断字段值是否匹配筛选条件
 * @param rowValue 行数据中的字段值
 * @param operator 操作符
 * @param value 筛选值
 * @param isNumericComparison 是否为数值比较，默认为 false
 * @param isDateComparison 是否为日期时间比较，默认为 false
 * @param isEmployeeSelect 是否为人员选择器，默认为 false
 * @returns 是否匹配
 */
export function matchFilterCondition(rowValue, operator, value, isNumericComparison = false, isDateComparison = false, isEmployeeSelect = false) {
    // 1. 处理 empty 和 notEmpty 操作符（不需要值）
    if (operator === 'empty' || operator === 'notEmpty') {
        return handleEmptyOperator(rowValue, operator);
    }
    // 2. 其他操作符需要值，如果没有值则不进行筛选
    if (value === undefined || value === null || value === '') {
        return true;
    }
    // 3. 处理人员选择器的筛选逻辑
    if (isEmployeeSelect) {
        return handleEmployeeSelectFilter(rowValue, operator, value);
    }
    // 4. 处理日期筛选逻辑
    if (isDateComparison) {
        const dateResult = handleDateFilter(rowValue, operator, value);
        if (dateResult !== null) {
            return dateResult;
        }
        // 如果日期筛选无法处理，继续使用其他比较逻辑
    }
    // 5. 处理数值比较
    if (isNumericComparison) {
        return handleNumericComparison(rowValue, operator, value);
    }
    // 6. 处理字符串比较（默认）
    return handleStringComparison(rowValue, operator, value);
}
// 自定义筛选函数
export const customFilterFn = (row, columnId, filterValue) => {
    // 如果没有筛选值，不进行筛选
    if (!filterValue) {
        return true;
    }
    // 获取行数据中的值
    const rowValue = row.getValue(columnId);
    const { operator, value, componentType, fieldId, fieldMap } = filterValue;
    // 根据组件类型判断比较方式
    const { isNumericComparison, isDateComparison, isEmployeeSelect } = getComparisonFlags(componentType);
    // 当字段启用 useDetailValue 时，从 object 行值中提取 x-fieldKey 指定的真实比较值
    const fieldSchema = fieldMap === null || fieldMap === void 0 ? void 0 : fieldMap[fieldId || columnId];
    const normalizedRowValue = normalizeDetailValue(rowValue, fieldSchema);
    // 使用统一的筛选逻辑函数，传递所有标志
    return matchFilterCondition(normalizedRowValue, operator, value, isNumericComparison, isDateComparison, isEmployeeSelect);
};
// 自动移除筛选条件的函数
customFilterFn.autoRemove = (val) => {
    // 如果没有值，则自动移除筛选条件
    if (!val) {
        return true;
    }
    // empty 和 notEmpty 操作符不需要值，所以即使值为空也不应该移除
    if (val.operator === 'empty' || val.operator === 'notEmpty') {
        return false;
    }
    // 其他操作符如果没有值，则自动移除筛选条件
    return !val.value;
};
