import type { FieldConfig } from './field-config';
import type { StaticDataSource } from './static-data-source';
import type { CnRequestConfig } from '@cainiaofe/cn-request';
import type { CnTableProps } from '@cainiaofe/cn-ui';
import type { CnAiBizRequestConfig } from './ai-runtime-config';
import type { LookupFieldCallbackFn } from './lookup-field-table-config';
import type { PrimaryKeyType } from '../view/utils/primary-key';
import type { AutoColumnWidthOptions } from '../view/components/views/table-view/hooks/use-auto-column-width';
type CnAiTableBizRequestConfig = Pick<CnAiBizRequestConfig, 'subTableConfig' | 'aiColumn' | 'agent' | 'smartFollow' | 'viewConfig' | 'cubePlatform'>;
/** 可配置的字段类型名称 */
export type FieldTypeName = 
/** AI 字段：支持 AI 能力字段（如摘要、智能补全等） */
'ai'
/** 引用字段：关联其他数据表字段 */
 | 'lookup'
/** 公式字段：通过表达式计算得到字段值 */
 | 'formula';
/** AI 字段配置（暂无可配置项，后续按需开放） */
export interface AiFieldsConfig {
}
/** 引用字段（Lookup）配置 */
export interface LookupFieldsConfig {
    /**
     * 子表配置请求 URL
     */
    subTableUrl?: string;
    /**
     * 子表配置请求方法
     * - GET：通过查询参数获取子表配置
     * - POST：通过请求体提交参数获取子表配置
     */
    subTableMethod?: 'GET' | 'POST';
    /**
     * 子表配置请求额外参数
     */
    subTableData?: Record<string, unknown>;
    /**
     * 为 true 时打平子表字段列表并隐藏「选择数据表」
     */
    hiddenSubTable?: boolean;
    /**
     * 引用字段创建回调
     */
    addFieldCallback?: LookupFieldCallbackFn;
    /**
     * 引用字段删除回调
     */
    deleteFieldCallback?: LookupFieldCallbackFn;
}
/** 公式字段配置（暂无可配置项，后续按需开放） */
export interface FormulaFieldsConfig {
}
/**
 * 各字段类型的配置项（纯配置，不含开关语义）。
 * 仅对 enabledFieldTypes 中包含的类型生效。
 */
export interface FieldTypeOptionsMap {
    /**
     * AI 字段配置
     */
    ai?: AiFieldsConfig;
    /**
     * 引用字段（Lookup）配置。
     * 当 `enabledFieldTypes` 包含 `lookup` 时可在此补充高级行为（如回调）。
     * 不传也可启用 lookup 的默认能力。
     */
    lookup?: LookupFieldsConfig;
    /**
     * 公式字段配置
     */
    formula?: FormulaFieldsConfig;
}
/** 可配置的视图类型名称 */
export type ViewTypeName = 
/** 表格视图：以表格形态展示数据 */
'grid'
/** 任务视图：以任务看板/任务流形态查看数据 */
 | 'task'
/** 智能跟单视图：提供跟单场景的智能分析视图 */
 | 'smartFollow';
/** 表格视图工具栏配置 */
export interface GridToolbarConfig {
    /**
     * 是否显示字段管理功能入口
     * @default true
     */
    fieldManagement?: boolean;
    /**
     * 是否显示筛选功能入口
     * @default true
     */
    filter?: boolean;
    /**
     * 是否显示排序功能入口
     * @default true
     */
    sort?: boolean;
    /**
     * 是否显示分组功能入口
     * @default true
     */
    group?: boolean;
    /**
     * 是否显示颜色填充功能入口
     * @default true
     */
    colorFill?: boolean;
}
/** 表格视图（Grid）配置 */
export interface GridViewConfig {
    /**
     * 工具栏配置，false 隐藏整个工具栏；不传或传对象时按各子项默认值生效
     */
    toolbar?: false | GridToolbarConfig;
}
/** 任务视图工具栏配置 */
export interface TaskToolbarConfig {
    /**
     * 是否显示卡片配置功能入口
     * @default true
     */
    cardManagement?: boolean;
    /**
     * 是否显示筛选功能入口
     * @default true
     */
    filter?: boolean;
    /**
     * 是否显示排序功能入口
     * @default true
     */
    sort?: boolean;
}
/** 任务视图配置 */
export interface TaskViewConfig {
    /**
     * 任务详情的 AI 总结
     * @default true
     */
    enableSummary?: boolean;
    /**
     * 工具栏配置，false 隐藏右侧工具区域（筛选/排序等），左侧功能区不受影响
     */
    toolbar?: false | TaskToolbarConfig;
}
/** 智能跟单视图配置 */
export interface SmartFollowConfig {
    /**
     * 跟单详情的 AI 摘要开关（仅当 `smartFollow` 传对象时生效）
     */
    enableDetailSummary: boolean;
}
/**
 * 视图类型精细配置对象。
 * - grid 始终存在，不支持 false
 * - task：省略 → 默认启用，false → 禁用，配置对象 → 启用并自定义
 * - smartFollow：省略 → 默认禁用，true → 启用默认配置，false → 禁用，配置对象 → 启用并自定义
 */
export interface ViewTypesConfigMap {
    /**
     * 表格视图配置（默认启用）
     */
    grid?: GridViewConfig;
    /**
     * 任务视图配置：省略默认启用，false 禁用，配置对象表示启用并定制
     */
    task?: false | TaskViewConfig;
    /**
     * 智能跟单视图配置：
     * - 省略：默认禁用
     * - true：启用并使用默认配置
     * - false：禁用
     * - 配置对象：启用并定制（需显式传 `enableDetailSummary`）
     */
    smartFollow?: boolean | SmartFollowConfig;
}
/**
 * 视图类型配置。
 * - 不传：启用 grid 和 task，smartFollow 默认禁用
 * - 对象：精细控制各视图的启用与配置
 */
export type ViewTypesConfig = ViewTypesConfigMap;
/**
 * CnAiTable 组件 Props
 */
export interface CnAiTableProps extends Pick<CnTableProps, 'columns' | 'format' | 'onSelectChange' | 'operateColumn' | 'rowSelection' | 'showIndex' | 'showSelect' | 'remote' | 'toolbar'> {
    /**
     * **【基础能力，推荐对客开放】** 是否启用自动列宽计算。
     *
     * 开启后组件会使用 canvas `measureText` 测量表头与单元格文本宽度，并将剩余容器空间
     * 均分给可伸缩列，确保列宽与实际内容匹配。
     *
     * - `true`（默认）：按内容自动计算列宽
     * - `false`：关闭自动计算，退回固定宽度/已有宽度；操作列宽度退回 `operateColumn.width`（未配置时为 `150`）
     *
     * **大多数场景直接使用默认值即可，无需手动配置。**
     *
     * @default true
     *
     * @example
     * // 推荐：默认开启，不传即可
     * <CnAiTable id="my-table" remote={remote} />
     *
     * @example
     * // 完全手动控制列宽时才需关闭
     * <CnAiTable columnsAutoWidth={false} operateColumn={{ width: 180 }} />
     */
    columnsAutoWidth?: boolean;
    /**
     * **【高级能力，按场景按需使用】** 自动列宽调优参数。
     *
     * 仅在 `columnsAutoWidth !== false` 时生效。**默认值在绝大多数场景下已足够，
     * 建议仅在遇到具体问题时才按需调整以下参数。**
     *
     * ---
     *
     * ### 推荐参数子集（安全、低风险）
     *
     * | 参数 | 说明 | 默认值 |
     * |---|---|---|
     * | `maxWidth` | 单列最大宽度（px），超出内容按省略展示 | `460` |
     * | `sampleRate` | 行采样率，数据 > 200 行时自动降为 `0.3`；手动设 `1` 可强制全量采样 | 自适应 |
     * | `fillContainerWidth` | 是否将容器剩余空间分配给可伸缩列 | `true` |
     *
     * ### 高级参数（仅专家场景使用）
     *
     * | 参数 | 说明 | 风险 |
     * |---|---|---|
     * | `getCustomWidth` | 按列二次加工最终宽度 | 需幂等、可预测，否则导致列宽抖动 |
     * | `headerFontSize` / `cellFontSize` | 测量字号 | 偏离实际渲染字号会引发测宽误差 |
     * | `additionalWidth` | 文本宽度之外额外叠加的像素 | 调整前需了解内部 padding 结构 |
     * | `headerExtraWidth` | 表头图标/间距额外占位 | 同上 |
     *
     * @example
     * // 推荐：仅限制最大宽度
     * columnsAutoWidthOpt={{ maxWidth: 360 }}
     *
     * @example
     * // 大数据量时手动指定采样率以平衡精度与性能
     * columnsAutoWidthOpt={{ sampleRate: 0.2, maxWidth: 420 }}
     *
     */
    columnsAutoWidthOpt?: AutoColumnWidthOptions;
    /**
     * 表格/页面唯一标识（用于 WebSocket 连接和 API 请求）
     */
    id?: string;
    /**
     * 字段映射数据源（静态或远程）
     */
    fieldMap?: DataSource<Record<string, FieldConfig>>;
    /**
     * 记录操作请求配置（创建、更新、查询等）
     * 仅在 `supportBatchEdit === true` 时才会生效。
     * 当前组件治理中不建议业务接入，配置将被运行时忽略，仅保留历史兼容占位。
     * @ignore
     */
    recordOperationRequestConfig?: {
        /**
         * 获取单条记录的请求配置
         */
        getOne?: {
            /** 具体请求参数 */
            requestConfig: CnRequestConfig;
        };
        /**
         * 创建记录的请求配置
         */
        create?: {
            /** 具体请求参数 */
            requestConfig: CnRequestConfig;
        };
        /**
         * 更新记录的请求配置
         */
        update?: {
            /** 具体请求参数 */
            requestConfig: CnRequestConfig;
        };
    };
    /**
     * 主键字段名或自定义取值函数，用于唯一标识每一行数据
     * - 字符串：record[primaryKey]
     * - 函数：primaryKey(record)
     * - 未传入或取值为空时，兜底使用 String(rowIndex)
     * 可以通过 setPrimaryKey 动态修改
     * 当使用 remote 配置时，服务端可以返回 primaryKey，会自动更新主键
     * @default 'id'
     */
    primaryKey?: PrimaryKeyType;
    /**
     * 是否支持批量编辑（表格内单元格编辑）
     * 为 true 时允许编辑，为 false 时整个表格不可编辑。
     * 当前组件治理中不建议业务接入，运行时固定忽略（等价 false），仅保留历史兼容占位。
     * @default false
     * @ignore
     */
    supportBatchEdit?: boolean;
    /**
     * 业务侧 AI 请求 URL 配置（仅表格链路）
     * 未配置时走组件内置默认地址。
     * 源码直连魔方开放平台时，`cubePlatform` 的 `pageId` / `appCode` 等须写在
     * `getListRequestConfig.data` / `createOrUpdateRequestConfig.data`。
     */
    bizRequestConfig?: CnAiTableBizRequestConfig;
    /**
     * 表格分组最大层级数
     * 控制表格支持的分组嵌套层数上限，设为 0 则禁用分组功能
     * @default 1
     */
    groupMaxLevels?: number;
    /**
     * 启用的字段类型白名单。
     * - 不传：全部禁用（默认关闭，需显式开启）
     * - 传具体值：仅启用列出的类型
     *
     * @example
     * // 只开 lookup
     * enabledFieldTypes={['lookup']}
     *
     * @example
     * // 关掉公式
     * enabledFieldTypes={['ai', 'lookup']}
     */
    enabledFieldTypes?: FieldTypeName[];
    /**
     * 各字段类型的详细配置（仅对已启用的类型生效）。
     * 不包含开关语义，开关由 enabledFieldTypes 控制。
     *
     * @example
     * // lookup 启用后，补充平铺行为与回调
     * fieldTypeOptions={{
     *   lookup: { hiddenSubTable: true, addFieldCallback: async () => {} }
     * }}
     */
    fieldTypeOptions?: FieldTypeOptionsMap;
    /**
     * 视图类型配置。
     * - 不传：启用 grid 和 task，智能跟单(smartFollow)默认关闭
     * - 对象：精细控制各视图的启用与配置（省略 task = 启用，省略 smartFollow = 关闭，true = 启用默认配置，false = 关闭，对象 = 启用+配置）
     * - 该配置仅控制“可用能力与开关”，不负责提供视图数据（视图数据来源见 `viewsConfigs`）
     *
     * 注意：smartFollow 需要显式启用，如 viewTypes={{ smartFollow: true }}
     *
     * @example
     * // 启用跟单，任务视图关闭 AI 总结
     * viewTypes={{ smartFollow: true, task: { enableSummary: false } }}
     *
     * @example
     * // 启用跟单，并关闭跟单详情 AI 摘要
     * viewTypes={{ smartFollow: { enableDetailSummary: false } }}
     *
     * @example
     * // 任务视图隐藏卡片配置入口
     * viewTypes={{ task: { toolbar: { cardManagement: false } } }}
     */
    viewTypes?: ViewTypesConfig;
    /**
     * 是否显示顶部视图 Tab
     * - `true`（默认）：显示顶部视图 Tab，支持多视图切换、新增、拖拽排序等交互
     * - `false`：隐藏顶部视图 Tab，仅展示 Grid（表格）视图内容；Task、SmartFollow 等视图入口一并隐藏
     *
     * 隐藏后组件行为：
     * - 不渲染 `CnDragTab`，不提供新增视图、拖拽排序、视图菜单等入口
     * - 若当前激活视图为非 Grid 类型，会自动切换回 Grid 视图，确保内容区与分页状态一致
     * - 外部事件（如 SWITCH_TO_SMART_FOLLOW）在隐藏模式下无效，不会切换到非 Grid 视图
     *
     * @default true
     */
    showViewTabs?: boolean;
    /**
     * 列头右键菜单总开关（关闭语义）。
     * - `false`（默认）：右键列头弹出自定义菜单（整列填色 / 冻结 / 排序 / 分组 / 筛选 / 编辑 AI/公式/引用列 / 删除字段）
     * - `true`：列头不绑定 onContextMenu，浏览器使用原生右键菜单
     *
     * 如需细粒度控制单项（filter/sort/group/colorFill），请使用 `viewTypes.grid.toolbarPermissions`。
     *
     * @default false
     */
    hideColumnHeaderMenu?: boolean;
}
/**
 * 远程数据源配置
 */
export interface RemoteDataSource {
    /** 固定为 remote，表示使用远程请求作为数据源 */
    type: 'remote';
    /**
     * 获取数据的请求配置
     */
    requestConfig: CnRequestConfig;
}
/**
 * 数据源配置（静态或远程）
 */
export type DataSource<T> = StaticDataSource<T> | RemoteDataSource;
export {};
