import { ICommand, CommandResult, CommandType, CommandPayloadMap, CursorMeta } from '../types';
import { Doc } from '../../view/Doc';
import { Wr, Wp, Wtbl, Wtr, Wtc } from '../../model/document';
import { RawElement } from '../../model/types/raw';
import { CursorManager } from '../../cursor/CursorManager';
export declare const SelectionMode: {
    readonly PP: "PP";
    readonly PTr: "PTr";
    readonly TrP: "TrP";
    readonly TrTr: "TrTr";
    readonly Tds: "Tds";
};
export type SelectionMode = (typeof SelectionMode)[keyof typeof SelectionMode];
export type SelectionModel = {
    model: Wp | Wtbl | Wtr | Wtc;
    match: 'full' | 'partial';
    children?: Wr[];
};
type SplitPayload = {
    id: string;
    offset: number;
    side: 'before' | 'after';
};
export type CursorContext = {
    wp?: Wp;
    wr?: Wr;
    pos?: number;
    side?: 'before' | 'after';
};
export type SelectionContext = [CursorContext, CursorContext];
export type PostCommandContext = CursorContext | SelectionContext | null;
/**
 * 命令基类
 * 提供通用的命令执行框架（如快照管理、布局渲染等）
 *
 * 子类只需实现 execute() 方法来定义具体的修改逻辑
 */
export declare abstract class CommandBase<T extends CommandType = CommandType> implements ICommand {
    protected doc: Doc;
    payload?: CommandPayloadMap[T];
    private snapshot?;
    protected postCommandContext: PostCommandContext;
    private commandRaf;
    /** 终止指令 */
    isTerminated: boolean;
    /** 重新刷新布局 */
    needsReLayout: boolean;
    output?: any;
    constructor(doc: Doc, payload?: CommandPayloadMap[T]);
    /**
     * 执行命令
     * 1. 保存当前文档快照
     * 2. 执行具体的修改逻辑（调用 execute）
     * 3. 重新布局和渲染
     * 4. 执行后续操作（调用 afterDo）
     */
    do(): Promise<CommandResult>;
    /**
     * 撤销命令
     * 1. 从快照恢复文档
     * 2. 重新布局和渲染
     * 3. 执行撤销后的后续操作（调用 afterUndo）
     */
    undo(): Promise<CommandResult>;
    /**
     * 保存文档快照
     */
    protected saveSnapshot(): RawElement | undefined;
    /**
     * 从快照恢复文档
     */
    protected restoreSnapshot(): void;
    /**
     * 重新布局和渲染
     */
    protected layout(): void;
    /**
     * 执行具体的修改逻辑
     * 子类需要实现此方法来定义具体的文档修改操作
     *
     * @example
     * // SetColor 的实现
     * protected execute() {
     *   const runs = this.doc.model?.document?.body?.children[0].runs;
     *   if (!runs) return;
     *   runs[0].rPr = { ...runs[0].rPr, color: this.payload };
     * }
     */
    protected abstract execute(): Promise<PostCommandContext>;
    /**
     * do() 执行后的后续操作（可选）
     * 在 do() 执行完 layout/render 后调用
     * 例如：更新光标位置、滚动到可视区域等
     *
     * @example
     * // InsertText 的实现
     * protected afterDo() {
     *   this.updateCursorPosition();
     * }
     */
    protected afterDo(): CommandResult;
    /**
     * 计算光标位置信息
     */
    protected calculateCursorMeta(context: CursorContext): CursorMeta | null;
    /**
     * 撤销后的后续操作（可选）
     * 在 undo() 执行完 layout/render 后调用
     * 通常不需要重写，因为撤销会恢复到之前的状态
     *
     * @example
     * // 特殊情况下可能需要
     * protected afterUndo() {
     *   this.resetSomeState();
     * }
     */
    protected afterUndo(): CommandResult;
    /**
     * 确定选区的类型模式
     */
    private static getSelectionMode;
    /**
     * run - xxx -run
     * @param doc
     * @param info
     * @returns
     */
    private static getModelsByPPSelection;
    /**
     * run - xxx - cell
     * @param doc
     * @param info
     * @returns
     */
    private static getModelsByPTrSelection;
    /**
     * cell - xxx - run
     * @param doc
     * @param info
     * @returns
     */
    private static getModelsByTrPSelection;
    /**
     * cell - xxx - cell (跨表格)
     * @param doc
     * @param info
     * @returns
     */
    private static getModelsByTrTrSelection;
    /**
     * cell - xxx - cell (不跨表格)
     * @param doc
     * @param info
     * @returns
     */
    private static getModelsByTdsSelection;
    /**
     * 获取选区范围内的所有模型节点
     * 这是选区处理的入口方法，会根据选区的开始和结束位置，自动选择合適的处理方式
     *
     * @param doc - 文档实例
     * @param selection - 选区信息
     * @returns 被选中的模型节点数组
     *
     * @remarks
     * 根据选区模式自动调用不同的处理函数：
     * - PP: 段落到段落选区
     * - PTr: 段落到表格行选区
     * - TrP: 表格行到段落选区
     * - TrTr: 表格行到表格行选区
     * - Tds: 单元格范围选区
     */
    protected static getSelectionResult(doc: Doc, selection: ReturnType<CursorManager['getSelection']>): {
        mode: SelectionMode | undefined;
        models: SelectionModel[];
        blockFirst: Wp | Wtbl | Wtr | undefined;
        blockLast: Wp | Wtbl | Wtr | undefined;
        blockBefore: any;
        blockAfter: any;
        inlineFirst: Wr | undefined;
        inlineLast: Wr | undefined;
        inlineBefore: any;
        inlineAfter: any;
    };
    /**
     * 清除选区内的内容
     * 根据选择模型的类型处理选区内的删除逻辑
     *
     * @param models - 选区模型数组
     */
    protected clearSelectionContent(models: SelectionModel[]): void;
    /**
     * 基于光标位置拆分run节点
     * 根据提供的偏移量和方向，将run节点拆分为前后两部分
     *
     * @param doc - 文档实例
     * @param payload - 拆分参数
     *   - id: layout run的节点ID
     *   - offset: run内的偏移量
     *   - side: 拆分方向 ('before' 表示在位置前拆分，'after' 表示在位置后拆分)
     * @returns 返回拆分结果，包含model层和layout层的before/after节点
     *   - modelBefore/modelAfter: 文档模型层的拆分结果（可选，当存在modelRef时返回）
     *   - layoutBefore/layoutAfter: 布局层的拆分结果（可选，当不存在modelRef时返回）
     *   - 若拆分失败或节点不存在返回 undefined
     */
    protected static splitRunAt(doc: Doc, payload: SplitPayload): {
        modelBefore?: Wr;
        modelAfter?: Wr;
        modelIndex: number;
        modelParent: Wp;
    } | undefined;
}
export {};
