import { Doc } from '../view/Doc';
import { PostChangePipelineContext } from './post-change-pipeline';
export type EmitSource = 'user' | 'dependency' | 'enrichment' | 'parent';
export type Data = Record<string, any>;
export type PartialData = Partial<Data>;
type JsonPath = string;
type SubscriptionCallback = (newValue: any, oldValue: any) => void;
/** 组件依赖按 runtime valuePath 写入的运行时配置（子表各行独立） */
export type FieldRuntimeSpecificConfig = {
    newReadonly?: boolean;
    newRequired?: boolean;
    newDisabled?: boolean;
    /** assignment 策略「始终覆盖」时按行不可输入 */
    cannotInput?: boolean;
};
/**
 * 数据管理器
 * 用于保存和操作原始 JSON 数据，支持基于 jsonpath 的读写操作
 * 所有数据读写都基于 jsonpath 查询进行
 */
export declare class DataManager {
    private doc?;
    private subscriptions;
    private depGraph;
    private depQueue;
    private computing;
    private layoutScheduled;
    private emitQueue;
    /** 串行化 emit 批处理，供 init/refresh 等待 enrich 写回 _href_ 后再排版 */
    private emitTail;
    private rawData;
    private postChangePipeline?;
    /** 无字段依赖的常量公式（如 true）已执行过的 depKey，防止重复 register 死循环 */
    private ranImmediateDepKeys;
    /** 正在执行「注册时立即跑」的依赖，避免 setMultiple 再次走完整 postChange */
    private runningImmediateDep;
    private immediateDepDataTouched;
    /** flushDependencies 期间由 dependency 写回的字段 path（供 enrichers 补跑） */
    private flushingDependencies;
    private dependencyFlushChangedPaths;
    /** 组件依赖回调写入的运行时配置，按 runtime valuePath 隔离（避免子表行共享 widgetMeta） */
    private fieldRuntimeConfigByPath;
    /**
     * 默认值 Map
     * key: jsonpath 路径 (支持 [n] 数组索引)
     * value: 默认值
     */
    private defaults;
    constructor(options?: {
        doc?: Doc;
        data?: Data;
    });
    /**
     * 调度 layout，自动合并同一微任务队列中的多个操作
     */
    attachPostChangePipeline(ctx: PostChangePipelineContext): void;
    /** 文档初始化 / 刷新数据后，对已有 value 跑一轮后置 enrich */
    runInitialPostChangeFlush(paths: JsonPath[]): Promise<void>;
    /** 等待已入队的 emit 批处理（含 postChange / enrich 写回）全部完成 */
    whenEmitSettled(): Promise<void>;
    /**
     * 对已注册的组件依赖全量重算（refresh 后 depGraph 已重建，需等 readonly/赋值稳定后再 enrich/layout）
     */
    flushAllFieldDependencies(): Promise<void>;
    private scheduleLayout;
    getLabelPath(path: JsonPath): JsonPath;
    getHrefPath(path: JsonPath): JsonPath;
    getFieldRuntimeSpecificConfigKeys(): string[];
    getRuntimeSpecificConfig(): [string, FieldRuntimeSpecificConfig][];
    setRuntimeSpecificConfig(entries: any): void;
    getFieldRuntimeSpecificConfig(path: JsonPath): FieldRuntimeSpecificConfig | undefined;
    setFieldRuntimeSpecificConfig(path: JsonPath, partial: FieldRuntimeSpecificConfig): void;
    /** 子表插行后：index 及之后的行配置下标 +1 */
    private shiftFieldRuntimeConfigAfterRowInsert;
    /** 子表删行后：移除该行配置，其后行配置下标 -1 */
    private shiftFieldRuntimeConfigAfterRowRemove;
    private parseSubtableFieldPath;
    /** 收集 depGraph 中所有 DepNode（按 key 去重） */
    private collectDepNodes;
    /** 依赖图结构变更后按 node.deps + targetPath 重建索引 */
    private rebuildDepGraphIndex;
    /** 子表插行后同步依赖 targetPath 下标 */
    private shiftDependencyGraphAfterRowInsert;
    /** 子表删行后移除该行依赖，并同步其后行的 targetPath 下标 */
    private shiftDependencyGraphAfterRowRemove;
    /** 供 PostChangePipeline 在同一微任务内刷新公式依赖，并返回联动写回的字段 path */
    flushDependenciesNow(): Promise<JsonPath[]>;
    private trackDependencyFieldChange;
    /**
     * 根据 jsonpath 获取原始数据（仅返回 rawData 中的值）
     * @param path jsonpath 路径 (例如: "document.body.children[0].text" 或 "user.name")
     * @returns 指定路径的值，不存在返回 undefined
     */
    get<T = any>(path: JsonPath): T | undefined;
    /**
     * 根据 jsonpath 获取标签数据
     * 优先获取带 LABEL_SUFFIX 的值，如果不存在则返回原值
     * @param path jsonpath 路径
     * @returns 指定路径的标签值或原值，不存在返回 undefined
     */
    getLabel<T = any>(path: JsonPath): T | undefined;
    /** 获取与 value 并存的超链接 href；无或不可链时为 null/undefined */
    getHref<T = string>(path: JsonPath): T | null | undefined;
    /** 子表数组路径下未软删行数 */
    countActiveSubtableRows(arrayPath: JsonPath): number;
    /** 版面可见行下标 → rawData 数组实际下标 */
    resolveSubtableVisibleIndex(arrayPath: JsonPath, visibleIndex: number): number;
    private assignField;
    /**
     * 根据 jsonpath 设置数据
     * @param path jsonpath 路径
     * @param value 要设置的值
     * @returns 是否设置成功
     */
    set(path: JsonPath, value: any, source?: EmitSource): boolean;
    /**
     * 从带数字下标的 path 推断二维坐标（供 setMultiple / patch / 业务回填等无 modelRef 的场景）
     * - 单轴：$.f_ewb[0].f_name → y=0；$.f_ewblink[1].x → x=1（需能从 rawData 的交叉 key 识别轴，或命中 link 命名启发）
     * - 交叉：$.f_ewb:f_ewblink[0][1].f_value → y=0,x=1
     * 不会处理 [n] 通配符；普通子表（如 $.b[0].c）不推断，避免破坏原有语义。
     */
    private infer2DPathAndCoords;
    /**
     * rawData 尚无交叉 key 时，用命名约定推测轴（避免误判普通子表 $.b[0]）
     * 须先于「f_ewb 主体」判断：f_ewblink 也以 f_ewb 开头。
     */
    private guessLinkSubTableAxis;
    private parse2DPath;
    private getCrossKeys;
    private resolveAxisByTableKey;
    private ensureAxisRowAndUid;
    private getFieldFromRow;
    /**
     * 按 y/x 坐标读取二维表数据（与 set2DByCoords 对称）
     * 交叉区在 rawData 中按 __gw_y_uid / __gw_x_uid 稀疏存储，不能直接用 [y][x] 下标 getByPath。
     */
    private get2DByCoords;
    private set2DByCoords;
    private cleanupCrossByAxisUid;
    /**
     * 复制轴行插入时：若 uid 与已有行重复，换新 uid 并复制关联交叉区行。
     */
    private duplicateCrossRowsByAxisUid;
    private prepareAxisRowForInsert;
    /**
     * 将一个部分值对象合进整体
     */
    patch(data: PartialData): void;
    /**
     * 根据 jsonpath 删除数据
     * @param path jsonpath 路径
     * @returns 是否删除成功
     */
    delete(path: JsonPath): boolean;
    /**
     * 根据 jsonpath 更新数据（使用回调函数）
     * @param path jsonpath 路径
     * @param callback 更新回调函数
     * @returns 是否更新成功
     */
    update<T = any>(path: JsonPath, callback: (value: T) => T): boolean;
    /**
     * 根据 jsonpath 批量设置数据
     * @param updates 路径与值的映射对象
     * @returns 是否全部设置成功
     */
    setMultiple(updates: Record<JsonPath, any>, source?: EmitSource): boolean;
    /** 依赖赋值写回 rawData，不触发 emit（用于注册期常量公式立即执行） */
    private applyDependencyWrites;
    /**
     * 在数组末尾添加一个或多个元素
     * @param path 数组的 jsonpath 路径
     * @param values 要添加的值，可以是多个值；如果不传则默认添加空对象
     * @returns 是否添加成功
     */
    push(path: JsonPath, ...values: any[]): boolean;
    /**
     * 移除数组末尾的元素
     * @param path 数组的 jsonpath 路径
     * @returns 被移除的元素，如果失败返回 undefined
     */
    pop(path: JsonPath): any | undefined;
    /**
     * 在数组指定位置插入一个或多个元素
     * @param path 数组的 jsonpath 路径
     * @param index 插入位置（0 表示开头）
     * @param values 要插入的值，可以是多个值；如果不传则默认插入空对象
     * @returns 是否插入成功
     */
    insertAt(path: JsonPath, index: number, ...values: any[]): boolean;
    /**
     * 移除数组指定位置的元素
     * @param path 数组的 jsonpath 路径
     * @param index 移除位置
     * @returns 被移除的元素，如果失败返回 undefined
     */
    removeAt(path: JsonPath, index: number): any | undefined;
    /**
     * 获取原始数据的深拷贝
     * @returns 原始 JSON 数据
     */
    getRawData(): Data;
    /**
     * 设置整个原始数据
     * @param data 新的 JSON 数据
     * @param defaultsMap 默认值， 字段值为 undefined 时才懒填充，不覆盖接口数据
     */
    setRawData(data: Data, defaultsMap?: Record<string, any>): void;
    /**
     * 将初始化数据直接写入 rawData（仅填充空值，不覆盖接口数据）
     * 与 defaults（懒填充）不同，此方法在初始化阶段一次性写入
     *
     * 支持两种子表路径形式：
     * - `[n]` 通配符：展开到 rawData 中已有的每一行（无则创建一行），如 `$.sub[n].field`
     * - 真实下标：直接写入指定行，如 `$.sub[0].field`
     *
     * 处理顺序：先展开 `[n]` 通配符，再写入真实下标路径。
     * 这样可以保证：参数映射（`[n]`）先铺好默认值，自定义数据源（真实下标）再精确覆盖。
     */
    applyInitData(initDataMap: Record<string, any>): void;
    /**
     * 按版面铺砖槽位补齐子表行数：
     * - 固定表：按槽位补齐自身子表行
     * - 二维/检验表：仅补齐关联轴（如 f_ewblink / f_jianyan2）
     *   不处理主体轴（如 f_ewb / f_jianyan1），避免覆盖接口行或误扩纵向轴。
     */
    private syncSubTableRowsToLayout;
    /** 子表在 rawData 中的行数（支持尚未转成数组的 { data: [] } 接口形态，此时返回 0 且不在此阶段强转） */
    private countSubTableDataRows;
    /**
     * 为检验表关联轴补足铺砖行：占位标记 + __gw_x_uid（与 push/insert 行为一致）。
     */
    private ensureCheckTableLinkLayoutRows;
    private applyInitDataCrossWildcard;
    /**
     * 解析子表初始化行数：接口已有行数、版面数据分组槽位。
     * layoutRows 为 0（如二维表纵向 f_ewb）时不按分组扩行，仅保证至少 1 行可绑定。
     */
    private resolveInitRowCount;
    /**
     * 将子表数组补齐到指定行数。
     * @param asPlaceholder true：push/insert 用的系统占位行（带 __gw_default）；false：applyInitData 物化行（空对象）
     */
    private ensureSubTableRowCount;
    /** 行已写入业务数据后去掉占位标记，避免提交/对比时被当成空行 */
    private clearPlaceholderFlag;
    private applyInitDataWildcard;
    /**
     * 内部方法：根据路径获取值
     */
    private getByPath;
    /**
     * 内部方法：根据路径设置值
     */
    private setByPath;
    /**
     * 内部方法：根据路径删除值
     */
    private deleteByPath;
    /**
     * 解析 jsonpath 路径字符串
     * 支持格式: "prop.nested[0].key" 或 "$" (根路径)
     */
    private parsePath;
    /**
     * 深拷贝对象
     */
    private deepClone;
    /**
     * 订阅指定路径的数据变化
     * @param path jsonpath 路径
     * @param callback 数据变化时的回调函数
     * @returns 取消订阅的函数
     */
    subscribe(path: JsonPath, callback: SubscriptionCallback): () => void;
    /**
     * 取消指定路径的所有订阅
     * @param path jsonpath 路径
     */
    unsubscribe(path?: JsonPath): void;
    /**
     * 调度 emit 事件，自动合并相同 path 的事件
     */
    private emit;
    /** 排空 emit 队列（同批合并 path，期间新入队项会继续处理） */
    private processEmitQueue;
    /**
     * 通知订阅者与依赖队列（不触发布局）
     * 实际执行 emit 逻辑
     */
    private doEmitNotify;
    /**
     * 获取父路径
     */
    private getParentPath;
    /**
     * 设计态删除字段后，清理该字段在 DataManager 中的绑定数据
     * @param designValuePath 设计时 valuePath（可含 [n] / [n_y][n_x] 通配符）
     * @param runtimeValuePath 版面解析后的具体路径（可选）
     */
    removeFieldBindingData(designValuePath: JsonPath, runtimeValuePath?: JsonPath): void;
    /** 收集与字段绑定相关的路径（含 value / label / href 及通配符变体） */
    private collectFieldBindingPaths;
    /** 收集可从 rawData 删除的具体路径（跳过含通配符的设计路径） */
    private collectConcreteRawDataPaths;
    /** 移除字段注册的组件依赖 */
    private removeFieldDependencies;
    /**
     * 设置默认值
     * @param path jsonpath 路径 (支持 [n] 数组索引和 [n] 通配符)
     * @param value 默认值
     */
    setDefault(path: JsonPath, value: any): void;
    /**
     * 批量设置默认值
     * @param defaultsMap 路径与值的映射对象
     */
    setDefaults(defaultsMap: Record<JsonPath, any>): void;
    /**
     * 获取默认值
     * 支持处理 [n] 数组索引的特殊情况
     * 例如：如果找不到 "items[0].name"，尝试找 "items[n].name"
     * @param path jsonpath 路径
     * @returns 默认值，不存在返回 undefined
     */
    getDefault<T = any>(path: JsonPath): T | undefined;
    /**
     * 将路径中的具体数组索引转换为默认值通配符
     * - 普通子表: items[0].name -> items[n].name
     * - 二维交叉区: $.f_ewb:f_ewblink[0][1].f_value -> $.f_ewb:f_ewblink[n_y][n_x].f_value
     */
    private convertPathToWildcard;
    private formatRuntimeValue;
    /** 组件依赖路径映射 */
    private resolveDepPaths;
    /**
     * 注册依赖
     * @param targetPath 依赖值计算后需写入的字段路径
     * @param expr 计算公式字符串
     * @param callback 回调函数
     */
    registerFieldDependency(targetPath: string, expr: string, callback?: (res: any) => any): void;
    /** 收集依赖 */
    private collectDependencies;
    /** 统一执行组件依赖 */
    private flushDependencies;
    /** 注册时立即执行无依赖的常量公式（true / 显示值等） */
    private runImmediateDependency;
    /** 执行依赖 */
    private runDepsByPath;
    /** 运行公式 */
    private runDependency;
    /**
     * 清空所有数据
     */
    clear(): void;
}
export {};
