import { ComputedRef, Ref, ShallowRef } from 'vue';
import { DocModeType } from '../../core/constants';
import { DocModel } from '../../core/model';
import { Page } from '../../core';
import { DocBaselineContext, DocUnsavedChanges, DocOperations, DocGetUnsavedChangesOptions } from '../doc-runtime/composables/useDocOperations';
import { OnlineFormInstanceResponse, OnlineFormTmplResponse } from '@gct-paas/api/apaas';
import { FieldChangeItem } from '../../runtime/interface/change-diff';
import { FormTmplConfigController } from '../../suites/edhr/panel-schema/data-load/hooks/form-tmpl-config';
export type { DocUnsavedChanges, DocGetUnsavedChangesOptions, } from '../doc-runtime/composables/useDocOperations';
export type { FieldModelQuery } from './field-model-query';
/** 字段权限信息 */
export interface FieldPermissionInfo {
    modelKey: string;
    fieldName: string;
    field: string;
    subModel: number;
    edit: boolean;
    readonly: boolean;
}
/** 套件插件协议 */
export interface WordSuitePlugin {
    /** 套件唯一标识 */
    key: string;
    /** 注册套件能力（调用全局 registry），应用启动时调用一次 */
    install(): void;
}
/** 文档页面信息（响应式渲染所需） */
export interface DocInfo {
    /** 页面数组 */
    pages: Page[];
    /** 布局刷新次数 */
    updateTick: number;
    /** 主渲染模式（文档未加载时为 null） */
    mode: DocModeType | null;
    /** 主渲染模式文案 */
    modeLabel: string;
    /** 按钮区渲染模式（文档未加载时为 null） */
    btnRenderModeType: DocModeType | null;
}
/** 只读文档查询 API（对外稳定） */
export interface DocQueryAPI {
    /** 根据模型字段 id 获取对应的布局节点（用于定位组件） */
    getWidgetByModelId(modelId: string): any | undefined;
    /** 根据分节 refId 获取所在页面对象（用于页面级定位） */
    getPaperBySecRefId(id: string): any | null;
}
/**
 * DocController 方法能力（代理 docInstance）
 */
export interface DocControllerMethods extends DocOperations {
    /** 执行内置命令系统命令（高级能力） */
    execute(command: string, payload?: any): void;
    /** 撤销上一步编辑操作 */
    undo(): void;
    /** 重做上一步被撤销的操作 */
    redo(): void;
    /** 设置渲染模式 */
    setMode(mode: DocModeType, updateBtn?: boolean): void;
    /** 用新的文档模型替换当前文档 */
    setModel(model: DocModel): void;
    /** 获取当前文档原始填报数据快照 */
    rawData(): Recordable<any>;
    /** 设置当前文档整个原始数据 */
    setRawData(data: Record<string, any>, defaultDataMap?: Record<string, any>): void;
    /** 根据 jsonpath 批量设置文档数据 */
    setMultiple(updates: Record<string, any>): boolean;
    /** 获取当前文档的所有子表信息 */
    getSubTableInfoList(): Array<{
        field: string;
        subType: string;
        name: string;
        key: string;
        [key: string]: any;
    }>;
    /** 手动触发文档重新加载 */
    reload(): void;
    /**
     * 仅重新拉取填报数据并更新 dataManager，不重建引擎。
     * 适用于填报模式保存后需要同步服务端最新数据的场景。
     */
    refreshData(): Promise<void>;
    /** 校验全量字段，返回错误映射；通过时返回 null */
    validate(): Promise<Record<string, string[]> | null>;
    /** 导出当前文档模型 XmlJson（常用于保存） */
    exportModel(): any;
    /** 获取文档内附件路径列表（默认提取 fw:file 组件） */
    getDocumentAttachmentPaths(types?: string[]): string[];
    /** 记录当前数据基线并切换到填报模式（用于后续变更比对） */
    enterBaseline(uniqueId: string): DocBaselineContext | null;
    /** 与基线做差异计算，返回字段变更列表 */
    computeBaselineChanges(ctx: DocBaselineContext): Promise<FieldChangeItem[]>;
    /** 获取当前未保存改动状态，适合外部在退出前做校验；特定场景可传入 includeRawData 同时比对填报数据 */
    getUnsavedChanges(options?: DocGetUnsavedChangesOptions): DocUnsavedChanges;
    /** 标记当前文档为已保存 */
    markAsSaved(): void;
    /** 向指定字段/组件设置批注信息 */
    setAnnotation(ids: string[], list: any[]): void;
}
/**
 * DocController 状态变量（只读/响应式）
 */
export interface DocControllerState {
    /** 当前渲染模式（响应式） */
    mode: ComputedRef<DocModeType | null>;
    /** 当前渲染模式中文文案（响应式） */
    modeLabel: ComputedRef<string>;
    /** 按钮区渲染模式（响应式） */
    btnRenderModeType: ComputedRef<DocModeType | null>;
    /** 布局刷新次数（响应式） */
    updateTick: ComputedRef<number>;
    /** 当前页面数组（响应式） */
    pages: ComputedRef<Page[]>;
}
/**
 * 对外受控文档句柄（controller）
 * 不暴露原始 docInstance，仅暴露稳定可控的查询/操作能力与响应式状态。
 *
 * 设计目标：
 * 1) 避免外部直接依赖内部实例细节；
 * 2) 保证升级时 API 兼容性；
 * 3) 将写操作统一收敛到受控方法，降低误用风险。
 */
export interface DocController extends DocControllerState, DocControllerMethods {
    /** 文档id */
    readonly id: string;
    /** 对外暴露的 api */
    readonly query: DocQueryAPI;
    /** 文档运行时元信息（接口数据 + 业务数据） */
    readonly docRuntimeMeta: DocRuntimeMeta;
}
/** docRuntimeMeta 中业务拼接的运行时处理信息 */
export interface DocRuntimeMetaHandleInfo {
    /** bpmn 流程类型 */
    bpmnType?: string;
    /** bpmn 字段权限映射 */
    bpmnFieldAuthMap?: Record<string, any>;
    /** 初始化的doc model 用来比对用 */
    initDocModelJson: string;
    /** 初始化后的填报原始数据快照，供 getUnsavedChanges({ includeRawData: true }) 比对 */
    initRawDataSnapshot?: Record<string, any>;
}
/** 文档运行时元信息（接口返回字段 + 业务拼接字段） */
export interface DocRuntimeMeta extends OnlineFormInstanceResponse, OnlineFormTmplResponse {
    /** 业务拼接的运行时处理信息 */
    handleInfo: DocRuntimeMetaHandleInfo;
}
/**
 * useWord 返回的运行时对象（SDK 公共面）
 */
export interface WordRuntime {
    /**
     * 对外暴露的文档控制器引用。
     *
     * 生命周期说明：
     * - 初始阶段为 null（文档未完成加载）；
     * - 文档就绪后变为 DocController；
     * - 当 requestId / options 变化触发重建时，可能短暂回到 null，再重新赋值。
     *
     * 使用建议：
     * - 在执行操作前先判空：controller.value?.xxx()；
     * - 在 watchEffect / watch 中监听 controller.value 的就绪状态；
     * - 通过该对象调用命令、读取页面与模式状态、访问只读查询 API。
     */
    controller: ShallowRef<DocController | null>;
    formTmplConfigController: FormTmplConfigController;
    /** 文档响应式页面信息（用于驱动 canvas 渲染） */
    docInfo: Ref<DocInfo>;
}
/** useWord 入参属性 */
export interface UseWordProps {
    /** 文档实例 id 或模板 id */
    requestId: string | undefined | (() => string | undefined);
    /** 批次号（可选） */
    materialNo?: string;
    /** 查询条件（可选） */
    requestQuery?: Recordable<any>;
    /** 扩展字段 - 兼容其他未明确定义的参数 */
    [key: string]: any;
}
/** useWord 配置选项 */
export interface UseWordOptions {
    /** 工厂类型：template（模板） | instance（实例） */
    factoryType: 'template' | 'instance';
    /** 主模型 key */
    modelKey: string;
    /** 套件 key（默认 'edhr'） */
    suiteKey?: string;
    /** 是否预览模式 */
    isPreview?: boolean;
    /** 是否模拟填报 */
    isMockReport?: boolean;
    /** 是否详情页（强制只读） */
    isDetailPage?: boolean | (() => boolean);
    /** 指定渲染模式 */
    renderModeType?: DocModeType;
    /**
     * 文档接口请求成功且引擎挂载完成后的回调（每轮成功加载触发一次）。
     * 不会在 requestId 为空、请求被丢弃、或初始化抛错时调用。
     */
    onDocumentLoadSuccess?: () => void;
    /**
     * 文档数据发生变化（防抖 300ms 后）的回调，可在此处触发外部自动保存通知。
     * 例：() => emitter.emit(EmitterEnum.__on_looper_auto_save)
     */
    onLooperAutoSave?: (payload?: {
        changed?: boolean;
    }) => void;
    /** 扩展字段 - 兼容其他未明确定义的负载参数 */
    [key: string]: any;
}
