import { Doc } from '../view/Doc';
export type Data = Record<string, any>;
export type PartialData = Partial<Data>;
type JsonPath = string;
type SubscriptionCallback = (newValue: any, oldValue: any) => void;
/**
 * 数据管理器
 * 用于保存和操作原始 JSON 数据，支持基于 jsonpath 的读写操作
 * 所有数据读写都基于 jsonpath 查询进行
 */
export declare class DataManager {
    private doc?;
    private subscriptions;
    private depGraph;
    private depQueue;
    private depScheduled;
    private computing;
    private layoutScheduled;
    private emitScheduled;
    private emitQueue;
    private rawData;
    /**
     * 默认值 Map
     * key: jsonpath 路径 (支持 [n] 数组索引)
     * value: 默认值
     */
    private defaults;
    constructor(options?: {
        doc?: Doc;
        data?: Data;
    });
    /**
     * 调度 layout，自动合并同一微任务队列中的多个操作
     */
    private scheduleLayout;
    getLabelPath(path: JsonPath): JsonPath;
    /**
     * 根据 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;
    private assignField;
    /**
     * 根据 jsonpath 设置数据
     * @param path jsonpath 路径
     * @param value 要设置的值
     * @returns 是否设置成功
     */
    set(path: JsonPath, value: any, source?: 'user' | 'dependency'): 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?: 'user' | 'dependency'): boolean;
    /**
     * 在数组末尾添加一个或多个元素
     * @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;
    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 逻辑
     */
    private doEmit;
    /**
     * 获取父路径
     */
    private getParentPath;
    /**
     * 设置默认值
     * @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;
    /** 执行依赖 */
    private runDepsByPath;
    /** 运行公式 */
    private runDependency;
    /**
     * 清空所有数据
     */
    clear(): void;
}
export {};
