import React from 'react';
import { FieldConfig } from '../../utils/data/const.js';
import type { PrimaryKeyType } from './utils/primary-key';
import { AiTableColumn } from './services/types/ai-column';
import { ColumnDefinitions, CustomFieldsConfig, LookupColumnConfig, RecordOperationRequestConfig, SmartFollowState, ViewConfig, ViewsData } from './types/model';
import type { CnAiBizRequestConfig } from '../../cn-ai-table/types';
import type { GridToolbarPermissions, LookupFieldCapability } from './utils/resolve-config';
export declare class DataModel {
    /** 表格ID */
    tableId: string;
    /** 共享数据源 - 全量数据 */
    rawData: any[];
    /** 原始列定义（从 props 传入的 columns） */
    originColumns: any[];
    /** 列定义（字段定义） */
    columnDefinitions: ColumnDefinitions[];
    /** 当前活动的视图 ID */
    activeViewId: string | null;
    /** 视图配置：viewId -> 配置 */
    viewConfigs: Map<string, ViewConfig>;
    /** 视图顺序数组（用于保持视图 tab 的排序） */
    viewOrder: string[];
    /** 表单元数据 */
    fieldMap: {};
    /** 记录操作请求配置 */
    recordOperationRequestConfig: RecordOperationRequestConfig | null;
    /** 表格选择信息（用于在分页栏显示选中数量） */
    selectKeys: string[];
    /** 存储的选中项信息 */
    storeSelectInfo: any[];
    /** 是否显示选中数量 */
    showSelectedNum: boolean;
    /** 当前视图（筛选/排序/分组后）结果集中被选中的条数，用于左下角「选中 x 项」；为 null 时用 selectKeys.length */
    selectedCountInCurrentView: number | null;
    /** AI列列表 */
    aiColumns: AiTableColumn[];
    /** AI 单元格数据层（独立于原始数据） */
    aiCellData: Map<string, any>;
    /** 运行中的AI任务列表 */
    runningTasks: Array<{
        columnCode: string;
        rowId: string;
    }>;
    /** 智能跟单状态（只保存 needAttentionRowIds，） */
    smartFollowState: SmartFollowState;
    /** 主键字段名或取值函数，用于唯一标识每一行数据，由外部通过 setPrimaryKey 设置 */
    primaryKey: PrimaryKeyType;
    /** 表格数据加载状态 */
    loading: boolean;
    /**
     * 视图显示顺序数据缓存
     * @description 存储每个视图当前页面实际显示的数据行顺序（考虑分组/筛选/排序）
     * key: viewId, value: 按显示顺序排列的数据行数组
     */
    displayOrderDataMap: Map<string, any[]>;
    /** 是否支持批量编辑（为 false 时整个表格不可编辑） */
    supportBatchEdit: boolean;
    /** 业务侧 AI 请求 URL 配置 */
    bizRequestConfig?: CnAiBizRequestConfig;
    /** 引用字段能力配置（由 resolvedConfig.fieldTypes.lookup 同步） */
    lookupFieldConfig: LookupFieldCapability | null;
    /** Grid 视图工具栏权限（由 resolvedConfig.viewTypes.grid.toolbarPermissions 同步）；列右键菜单等下游消费者直接 useModel 读取，避免逐层透传 */
    gridToolbarPermissions: GridToolbarPermissions | null;
    /** 列头右键菜单关闭开关；true 时列头不绑 onContextMenu，浏览器走原生菜单 */
    hideColumnHeaderMenu: boolean;
    /**
     * 魔方用户配置表行主键（createOrUpdate 顶层 `id` / content 根级 `id`）。
     * 首次创建后由保存响应写入；后续更新作为 hint 传给 persist。
     */
    cubePlatformUserConfigRowId: string;
    /** 表级自定义字段配置（AI字段、公式字段等） */
    customFields: CustomFieldsConfig;
    constructor();
    /** 设置记录操作请求配置 */
    setRecordOperationRequestConfig(config: {
        getOne?: {
            requestConfig: any;
        };
        create?: {
            requestConfig: any;
        };
        update?: {
            requestConfig: any;
        };
    }): void;
    /** 设置表格ID */
    setTableId(tableId: string): void;
    /** 魔方开放平台用户配置行主键（与视图 save、AI 列 save 共用） */
    setCubePlatformUserConfigRowId(id: string): void;
    /** 设置加载状态 */
    setLoading(loading: boolean): void;
    /** 设置智能跟单状态（只保存 needAttentionRowIds，） */
    setSmartFollowState(state: {
        loading: boolean;
        needAttentionRowIds: string[];
        runningTasks: any[];
        conversationId: string | null;
        refresh?: (options?: {
            forcePrompt?: boolean;
            resetConversation?: boolean;
        }) => void;
    }): void;
    /**
     * 设置主键字段名或取值函数
     * @param key 字符串字段名或自定义取值函数；传入空字符串等无效值时回落到默认主键
     */
    setPrimaryKey(key: PrimaryKeyType): void;
    /**
     * 获取行的唯一标识（带 rowIndex 兜底，保留原始类型）。
     *
     * 适用于：渲染、行选择、回传给业务方/服务端等需要保留原始 number/string 类型的场景。
     * Falsy 规则：`0` / `false` / `''` 视为有效；仅 `null` / `undefined` 触发 rowIndex 兜底。
     *
     * @param row 行数据
     * @param rowIndex 行索引，用于 primaryKey 取值为空时兜底
     * @returns 行的唯一标识值
     */
    getRowKey(row: any, rowIndex?: number): string | number;
    /**
     * 严格获取行唯一标识，**不做 rowIndex 兜底**。
     *
     * 适用于：服务端 rowId 上送、持久化、拖拽身份等不允许 index 兜底的场景。
     * 当 primaryKey 无法取到有效值时返回 `null`，调用方据此跳过该行或报错。
     */
    getRowKeyStrict(row: any): string | number | null;
    /**
     * 获取行唯一标识并标准化为**字符串**。
     *
     * 适用于：React key / Set / Map / DOM data-* / URL 参数等需要字符串身份的场景。
     * ⚠️ 会丢失原始类型信息，不要用于回传给业务方/服务端。
     */
    getRowKeyId(row: any, rowIndex?: number): string;
    /**
     * 判断两个行 key 是否指向同一条 record。
     *
     * 规则：任一为 `null` / `undefined` 返回 `false`；否则按 `String(a) === String(b)` 比较。
     * 用于兼容上下游分别按 number / string 持有同一 id 的场景，避免历史宽松等价坑。
     */
    isSameRowKey(a: string | number | null | undefined, b: string | number | null | undefined): boolean;
    /** 设置数据操作 - 自动同步到所有视图，并重算公式列（派生值随源数据自动刷新） */
    setRawData(data: any[]): void;
    /**
     * 对传入数据批量重算所有公式列。
     * 公式是派生值，rawData 一旦被替换，必须根据当前 formulaConfig 重新生成，
     * 避免服务端原始数据覆盖掉公式结果。
     */
    private applyFormulaCompute;
    /** 设置原始列定义（从 props 传入） */
    setOriginColumns(columns: any[]): void;
    /** 设置列定义(by 视图维度) */
    setColumnDefinitions(columns: Array<{
        dataIndex: string;
        title: string;
        format?: string;
        [key: string]: any;
    }>): void;
    updateCell(rowId: string | number, columnId: string, value: any): void;
    updateRow(rowId: string | number, row: any): void;
    addRow(row: any): void;
    addColumn(column: any): void;
    removeRow(rowId: string | number): void;
    getViewConfig(viewId: string): ViewConfig;
    setViewConfig(viewId: string, config: Partial<ViewConfig>, shouldPersist?: boolean): void;
    setActiveView(viewId: string): void;
    getViewData(viewId: string): any[];
    /**
     * 设置视图的显示顺序数据
     * @description 由表格视图组件在数据变化时调用，更新当前视图的显示顺序数据
     * 这个数据考虑了分组/筛选/排序后的实际显示顺序
     * @param viewId - 视图ID
     * @param rows - 按显示顺序排列的数据行数组
     */
    setDisplayOrderData(viewId: string, rows: any[]): void;
    /**
     * 获取视图的显示顺序数据
     * @description 获取当前视图页面实际显示的数据行顺序（考虑分组/筛选/排序）
     * 如果没有缓存，则回退到 getViewData（仅筛选，不考虑分组顺序）
     * @param viewId - 视图ID
     * @returns 按显示顺序排列的数据行数组
     */
    getDisplayOrderData(viewId: string): any[];
    getViewColumns(viewId: string): {
        editable: boolean;
        dataIndex: string;
        title: string;
        format?: string;
    }[];
    getViewColumnMetaData(viewId: string): FieldConfig[];
    createView(type: string, name?: string, initialConfig?: Partial<ViewConfig>): string;
    /**
     * 把当前视图配置合成为 `ViewsData` 普通对象。
     * 与 `updateRemoteViews()` 内部的"清洗后持久化"快照独立——本方法返回未清洗的运行时原状，
     * 供运行时镜像 / 调试读取等只读消费。
     */
    toViewsDataSnapshot(): ViewsData;
    updateRemoteViews(): Promise<void>;
    /**
     * @description 重置视图配置为初始默认值: 测试用的，不要在生产环境使用。
     * - AI 字段：逐个调用远程删除接口，再清理本地状态
     * - 公式字段：仅清理本地状态
     * - 视图配置：清空筛选、排序、分组、填色、隐藏列、冻结列等
     * 保留视图的身份信息（id、name、type）
     */
    resetViewConfig(viewId: string): Promise<void>;
    /**
     * 从 columnDefinitions 中移除指定字段（不触发视图配置同步）
     */
    private removeFieldFromColumnDefinitions;
    deleteView(viewId: string): void;
    reorderViews(newViewIds: string[]): void;
    setAllViews(views: ViewsData, options?: {
        /** 为 false 时不注入智能跟单视图，并移除已有 SmartFollow */
        enableSmartFollow?: boolean;
    }): void;
    getAllViews(): ViewConfig[];
    getViewsByType(type: string): ViewConfig[];
    setFieldMap(fieldMap: any): void;
    getFieldItem(key: string): any;
    setSelectionInfo(selectKeys: string[], storeSelectInfo: any[], showSelectedNum?: boolean): void;
    setSelectedCountInCurrentView(count: number | null): void;
    /** 设置是否支持批量编辑 */
    setSupportBatchEdit(support: boolean): void;
    setBizRequestConfig(config?: CnAiBizRequestConfig): void;
    setLookupFieldConfig(config: LookupFieldCapability | null): void;
    setGridToolbarPermissions(permissions: GridToolbarPermissions | null): void;
    setHideColumnHeaderMenu(hide: boolean): void;
    isFieldEditable(columnId: string): boolean;
    getFieldMap(): {};
    /**
     * 从 ViewsData 解析 customFields，处理历史数据迁移
     * 幂等：如果 customFields 已存在则直接使用，不再从视图级合并
     */
    resolveCustomFields(viewsData: ViewsData): void;
    /** 获取表级 AI 字段配置 */
    getCustomFieldAiConfig(columnCode: string): import("./types/model").AiColumnConfig;
    /** 写入表级 AI 字段配置 */
    setCustomFieldAiConfig(columnCode: string, config: any): void;
    /** 从表级配置中移除自定义字段 */
    removeCustomField(columnCode: string): void;
    /** 获取表级公式字段配置 */
    getCustomFieldFormulaConfig(columnCode: string): import("./types/model").FormulaColumnConfig;
    /** 写入表级公式字段配置 */
    setCustomFieldFormulaConfig(columnCode: string, config: any): void;
    /** 获取表级引用字段配置 */
    getCustomFieldLookupConfig(columnCode: string): LookupColumnConfig | undefined;
    /** 写入表级引用字段配置 */
    setCustomFieldLookupConfig(columnCode: string, config: LookupColumnConfig): void;
    /**
     * 设置 AI 列列表
     */
    setAiColumns(columns: AiTableColumn[]): void;
    /**
     * 获取 AI 列列表
     */
    getAiColumns(): AiTableColumn[];
    /**
     * 将 AI 列合并到全局列定义中（不自动同步到视图）
     * @param aiColumns AI 列列表
     * @param shouldPersist 是否持久化到远程
     */
    mergeAiColumns(aiColumns: AiTableColumn[], shouldPersist?: boolean): void;
    /**
     * 将公式列合并到全局列定义中（从 customFields.formulaConfig 恢复）
     * 页面加载时调用，确保公式列在 columnDefinitions 中存在
     */
    mergeFormulaColumns(): void;
    /**
     * 将引用字段合并到全局列定义中（从 customFields.lookupConfig 恢复）
     * 页面加载时调用，确保引用字段列在 columnDefinitions 中存在
     */
    mergeLookupColumns(): void;
    /**
     * 判断是否为 AI 列
     */
    isAiColumn(columnId: string): boolean;
    /**
     * 获取 AI 列配置
     */
    getAiColumnConfig(columnId: string): AiTableColumn | undefined;
    /**
     * 添加 AI 列到指定视图
     * 改造后：添加到表级 customFields.aiColumns + 各视图 columnOrder，确保该视图可见
     */
    addAiColumnToView(viewId: string, columnCode: string, shouldPersist?: boolean): void;
    /**
     * 从指定视图移除 AI 列（仅隐藏，不从表级移除）
     */
    removeAiColumnFromView(viewId: string, columnCode: string, shouldPersist?: boolean): void;
    /**
     * 批量添加 AI 列到指定视图
     */
    addAiColumnsToView(viewId: string, columnCodes: string[], shouldPersist?: boolean): void;
    /**
     * 获取视图中可见的 AI 列（不在 hiddenColumns 中的表级 AI 列）
     */
    getViewAiColumns(viewId: string): string[];
    /**
     * 判断视图是否启用了指定的 AI 列
     */
    isAiColumnEnabledInView(viewId: string, columnCode: string): boolean;
    /**
     * 设置运行中的任务列表
     */
    setRunningTasks(tasks: Array<{
        columnCode: string;
        rowId: string;
    }>): void;
    /**
     * 判断某个单元格的任务是否正在运行
     */
    isTaskRunning(columnId: string, rowId: string): boolean;
    /**
     * 添加单个运行中的任务
     */
    addRunningTask(columnCode: string, rowId: string): void;
    /**
     * 移除单个运行中的任务
     */
    removeRunningTask(columnCode: string, rowId: string): void;
    /**
     * 设置单个 AI 单元格数据
     * @param rowId 行 ID
     * @param columnCode 列编码
     * @param value 单元格值
     */
    setAiCellData(rowId: string | number, columnCode: string, value: any): void;
    /**
     * 获取单个 AI 单元格数据
     * @param rowId 行 ID
     * @param columnCode 列编码
     * @returns 单元格值，如果不存在返回 undefined
     */
    getAiCellValue(rowId: string | number, columnCode: string): any;
    /**
     * 批量合并 AI 任务结果到 AI 单元格数据层
     * @param taskResults 任务结果数组
     */
    mergeAiTaskResults(taskResults: Array<{
        rowId: string;
        columnCode: string;
        jobOutput: any;
    }>): void;
    /**
     * 清除所有 AI 单元格数据
     */
    clearAiCellData(): void;
    /**
     * 清除指定列的 AI 单元格数据
     * @param columnCode 列编码
     */
    clearAiColumnCellData(columnCode: string): void;
    /**
     * 获取带有 AI 数据的行（将 AI 单元格数据合并到原始行数据中）
     * @param row 原始行数据
     * @returns 合并了 AI 数据的行
     */
    getDisplayRow(row: any): any;
    /**
     * 获取带有 AI 数据的完整数据集
     * @returns 合并了 AI 数据的数据数组
     */
    getDisplayData(): any[];
    /**
     * 判断是否为主视图（第一个 Grid 视图）
     * 主视图不能被删除，不能被拖拽
     * @param viewId 视图 ID
     * @returns 是否为主视图
     */
    isPrimaryView(viewId: string): boolean;
    /**
     * 判断视图是否可以被删除
     * 主视图和 SmartFollow 视图不能被删除
     * @param viewId 视图 ID
     * @returns 是否可以删除
     */
    canDeleteView(viewId: string): boolean;
    /**
     * 判断视图是否可以被拖拽
     * 主视图和 SmartFollow 视图不能被拖拽
     * @param viewId 视图 ID
     * @returns 是否可以拖拽
     */
    canDragView(viewId: string): boolean;
    /**
     * 创建 / 修改  AI 列定义对象
     * @param aiCol AI 列数据
     * @returns 列定义对象
     */
    createOrUpdateAiColumnDef(aiCol: AiTableColumn): {
        dataIndex: string;
        title: string;
        accessorKey: string;
        isAiColumn: boolean;
        format: string;
        aiConfig: {
            scenarioId: string;
            promptTemplate: string;
        };
        header: React.DetailedReactHTMLElement<{
            style: {
                display: "flex";
                alignItems: "center";
                gap: string;
            };
        }, HTMLElement>;
    };
    /**
     * 创建默认视图配置
     * @param type 视图类型
     * @returns 视图配置对象
     */
    private createDefaultViewConfig;
    private initDefaultViews;
    private getDefaultViewName;
    /**
     * 生成 AI 单元格数据的 key
     */
    private getAiCellKey;
    private applyViewFilters;
    private applyFilters;
    private applySorting;
    /**
     * 根据字段ID列表生成 tableColumns
     * @param columnIds 字段ID数组
     * @returns 符合 getColumnMetadata 要求的格式
     */
    private buildTableColumns;
}
