import { DataManager } from '../data/DataManager';
import { Wtr, Wtbl, Wtc } from '../model/document';
import { RepeatingRegion, BoundedRegion, TableHeaderRegion, SubTableHeaderRegion, CheckTableRegion, _2DTableRegion } from '../model/logic';
import { LinkSubTableCellZone } from '../layout/linkSubTableLayout';
import { Doc } from '../view/Doc';
/** 表格矩形范围（含起止行列，均为闭区间） */
export type TableRange = {
    start: {
        row: number;
        col: number;
    };
    end: {
        row: number;
        col: number;
    };
};
/** 展开后的单元格片段，供布局与数据绑定使用 */
export type CellFragment = {
    id: string;
    expandFromId: string;
    rowspan: number;
    colspan: number;
    dataIndex?: number;
    /** 二维表横向数据索引（数据关联区） */
    xDataIndex?: number;
    /** 二维表纵向数据索引 */
    yDataIndex?: number;
    repeatingId?: string;
    _2DTableId?: string;
    boundedId?: string;
    checkTableId?: string;
    mergeFromId?: string;
    headerId?: string;
    /** 数据关联子表单元格分区：交叉 / 横向 / 纵向 */
    cellZone?: LinkSubTableCellZone;
};
type RowFragment = {
    id: string;
    expandFromId: string;
    cells: CellFragment[];
};
type ModelNode = Wtr | Wtc;
/** 模板坐标 "row,col" → 数据项索引及引用单元格 */
type IndexMap = Map<string, {
    dataIndex: number;
    refPos?: string;
    refCellId?: string;
}>;
type SubTableRegion = RepeatingRegion | BoundedRegion | CheckTableRegion | _2DTableRegion;
export declare class TableExpander {
    table: Wtbl;
    doc: Doc;
    data: DataManager;
    /** 模板节点 id → Wtr / Wtc */
    modelMapper: Map<string, ModelNode>;
    /** 展开实例 id → RowFragment / CellFragment */
    instanceMapper: Map<string, RowFragment | CellFragment>;
    /** 模板行索引 → 各类逻辑区域（用于按行分发展开策略） */
    rowIndexRepeatingMapper: Map<number, RepeatingRegion>;
    rowIndex2DTableMapper: Map<number, _2DTableRegion>;
    rowIndexBoundedMapper: Map<number, BoundedRegion>;
    rowIndexCheckTableMapper: Map<number, CheckTableRegion>;
    rowIndexTableHeaderMapper: Map<number, TableHeaderRegion | SubTableHeaderRegion>;
    rowIdTableHeaderMapper: Map<string, TableHeaderRegion | SubTableHeaderRegion>;
    rowIdSubTableMapper: Map<string, SubTableRegion>;
    /** 固定表 / 检验表 / 二维表：数据关联铺砖后的单元格数据索引 */
    boundedCellDataIndexMap: IndexMap;
    checkTableCellDataIndexMap: IndexMap;
    _2DTableCellDataIndexMap: IndexMap;
    /** 展开后的行列表（按文档顺序） */
    rows: RowFragment[];
    /** 表头区域 id → 该区域包含的模板行 id 列表 */
    regionIdTableHeaderMetaMap: Map<string, {
        rowIds: string[];
    }>;
    constructor(table: Wtbl, doc: Doc);
    getModelById<T extends ModelNode = Wtc>(id: string): T | undefined;
    initialize(): void;
    private initializeModelMapper;
    /** 建立模板行索引 / 行 id 与各类子表、表头区域的映射 */
    private initializeRegionMappers;
    private registerRowsForRegions;
    private initializeTableHeaderMapper;
    private initializeBoundedItemDataIndex;
    /**
     * 检验表 / 二维表的数据关联区：itemRegion 可能超出子表行范围（向上/下扩充），
     * 展开铺砖时需用扩充后的行范围。
     */
    private getDataGroup2DItemRange;
    private initializeDataGroup2DDataIndex;
    private initLinkSubTableCellIndexMaps;
    private mergeIndexMap;
    private initializeRows;
    /** 编辑模式只展开一份；预览/填报模式按数据路径长度重复 */
    getRepeatCount(region: RepeatingRegion | _2DTableRegion): number;
    private initializeRepeatingRowsInRange;
    private initialize2DTableRowsInRange;
    /**
     * 循环子表与二维子表共用的纵向展开逻辑：
     * 按数据条数复制行块，区域外最后一行单元格需合并 rowspan 以覆盖重复产生的额外行。
     */
    private initializeRepeatableSubTableRows;
    /**
     * 循环区域外、首条数据最后一行：将 rowspan 拉长以吞并后续重复行，
     * 避免区域外单元格被拆成多行。
     */
    private tryCreateExtendedRowspanCell;
    private initializeBoundedRowInRange;
    private initializeCheckTableRowInRange;
    private initializeTableHeaderRowInRange;
    private initializeNormalRowInRange;
    private buildSingleTemplateRow;
    private createTemplateCell;
    private pushRow;
    private getLinkSubTableCellIndexMap;
    private getFillEndColForRegion;
    private findLinkSubTableRegionForCell;
    private resolveLinkSubTableCellMeta;
    /** 根据主单元格的 rowspan/colspan，为被覆盖的从属单元格设置 mergeFromId */
    private transformMergeRelations;
    /**
     * 计算单元格对应的数据索引（用于范围扩展 / 数据关联铺砖）。
     *
     * @param range - 需要分配数据项的总区域
     * @param itemRange - 单个数据项的模板大小（局部范围索引均为 0）
     * @param fillDirection - `x`：先横向铺砖再换行；`y`：先纵向铺砖再换列
     * @returns key 为 "row,col"，含 dataIndex 及引用模板单元格 id
     */
    computeDataIndexMap(range: TableRange, itemRange: TableRange, fillDirection?: 'x' | 'y'): IndexMap;
}
export {};
