/**
 * 检查点系统类型定义
 * 基于 Cline 的 Shadow Git 架构
 */

/**
 * 检查点触发类型
 */
export type CheckpointTrigger =
  | 'auto' // 自动创建
  | 'manual' // 用户手动
  | 'tool:write_file' // 写文件前
  | 'tool:edit_file' // 编辑文件前
  | 'tool:delete_file' // 删除文件前
  | 'tool:move_file' // 移动文件前
  | 'tool:copy_file' // 复制文件前
  | 'tool:bash' // bash 命令前
  | 'task_start' // 任务开始
  | 'task_complete' // 任务完成
  | 'pre_rollback' // 回滚前（用于 unrevert）
  | 'session_start' // 会话开始
  | 'session_end'; // 会话结束

/**
 * 检查点元数据
 */
export interface CheckpointMetadata {
  /** 唯一标识 */
  id: string;
  /** 用户可读名称 */
  name?: string;
  /** 描述信息 */
  description?: string;
  /** 创建时间戳 */
  timestamp: number;
  /** 触发类型 */
  trigger: CheckpointTrigger;
  /** 关联的工具调用 */
  toolCall?: {
    tool: string;
    params: Record<string, unknown>;
  };
  /** Git commit hash */
  commitHash: string;
  /** 受影响的文件数 */
  filesChanged: number;
  /** 关联的消息 ID */
  messageId?: string;
  /** 会话 ID */
  sessionId?: string;
  /** 对话轮次 */
  turnIndex?: number;
}

/**
 * 检查点配置
 */
export interface CheckpointConfig {
  /** 是否启用检查点系统 */
  enabled: boolean;
  /** 自动检查点配置 */
  autoCheckpoint: {
    /** 写文件前创建检查点 */
    beforeWrite: boolean;
    /** 编辑文件前创建检查点 */
    beforeEdit: boolean;
    /** 删除文件前创建检查点 */
    beforeDelete: boolean;
    /** 移动/复制文件前创建检查点 */
    beforeMove: boolean;
    /** bash 命令前创建检查点 */
    beforeBash: boolean;
  };
  /** 最大保留检查点数量 */
  maxCheckpoints: number;
  /** 检查点最大保留时间 (毫秒) */
  maxAge: number;
  /** Shadow Git 存储目录 */
  storageDir: string;
}

/**
 * 默认配置
 */
export const DEFAULT_CHECKPOINT_CONFIG: CheckpointConfig = {
  enabled: true,
  autoCheckpoint: {
    beforeWrite: true,
    beforeEdit: true,
    beforeDelete: true,
    beforeMove: true,
    beforeBash: false,
  },
  maxCheckpoints: 100,
  maxAge: 7 * 24 * 60 * 60 * 1000, // 7 天
  storageDir: '.ai-assist/checkpoints',
};

/**
 * 文件变更类型
 */
export type FileChangeType = 'added' | 'modified' | 'deleted' | 'renamed';

/**
 * 文件变更信息
 */
export interface FileChange {
  /** 文件路径 */
  path: string;
  /** 变更类型 */
  type: FileChangeType;
  /** 旧路径 (重命名时) */
  oldPath?: string;
  /** 添加的行数 */
  insertions?: number;
  /** 删除的行数 */
  deletions?: number;
}

/**
 * 差异信息
 */
export interface DiffInfo {
  /** 源检查点/commit */
  from: string;
  /** 目标检查点/commit (HEAD 表示当前工作区) */
  to: string;
  /** 变更的文件列表 */
  files: FileChange[];
  /** 总添加行数 */
  totalInsertions: number;
  /** 总删除行数 */
  totalDeletions: number;
}

/**
 * 文件内容差异
 */
export interface FileDiff {
  /** 文件路径 */
  path: string;
  /** 变更类型 */
  type: FileChangeType;
  /** 旧内容 */
  oldContent?: string;
  /** 新内容 */
  newContent?: string;
  /** 差异补丁 (unified diff 格式) */
  patch?: string;
}

/**
 * 恢复模式
 */
export enum RestoreMode {
  /** 仅恢复 AI 修改的文件 */
  AI_CHANGES_ONLY = 'ai_changes_only',
  /** 仅恢复工作区变更 */
  WORKSPACE_ONLY = 'workspace_only',
  /** 完整恢复（AI + 工作区） */
  FULL = 'full',
}

/**
 * 回滚选项
 */
export interface RollbackOptions {
  /** 检查点 ID 或 commit hash */
  target: string;
  /** 只回滚指定文件 */
  files?: string[];
  /** 预览模式 (不实际执行) */
  dryRun?: boolean;
  /** 恢复模式 */
  mode?: RestoreMode;
  /** 跳过安全检查 */
  skipSafetyCheck?: boolean;
}

/**
 * 回滚结果
 */
export interface RollbackResult {
  /** 是否成功 */
  success: boolean;
  /** 恢复的文件列表 */
  restoredFiles: string[];
  /** 错误列表 */
  errors: Array<{ file: string; error: string }>;
  /** 回滚前的 commit hash (用于撤销回滚) */
  previousCommit?: string;
}

/**
 * 检查点事件类型
 */
export type CheckpointEventType =
  | 'created' // 检查点已创建
  | 'restored' // 已回滚到检查点
  | 'deleted' // 检查点已删除
  | 'cleanup'; // 清理过期检查点

/**
 * 检查点事件
 */
export interface CheckpointEvent {
  type: CheckpointEventType;
  checkpoint?: CheckpointMetadata;
  timestamp: number;
  details?: Record<string, unknown>;
}

/**
 * 检查点事件监听器
 */
export type CheckpointEventListener = (event: CheckpointEvent) => void;

/**
 * 回滚记录（用于 unrevert）
 */
export interface RollbackRecord {
  /** 唯一标识 */
  id: string;
  /** 时间戳 */
  timestamp: number;
  /** 目标检查点 */
  targetCheckpoint: string;
  /** 回滚前的 commit hash */
  previousCommit: string;
  /** 恢复的文件列表 */
  restoredFiles: string[];
  /** 是否可撤销 */
  canUnrevert: boolean;
}

/**
 * 撤销回滚结果
 */
export interface UnrevertResult {
  /** 是否成功 */
  success: boolean;
  /** 恢复的 commit */
  restoredCommit: string;
  /** 恢复的文件数 */
  filesRestored: number;
  /** 错误信息 */
  error?: string;
}

/**
 * 安全检查结果
 */
export interface SafetyCheckResult {
  /** 是否安全 */
  safe: boolean;
  /** 警告列表 */
  warnings: string[];
  /** 错误列表 */
  errors: string[];
}

/**
 * 会话状态
 */
export interface SessionState {
  /** 会话 ID */
  id: string;
  /** 开始时间 */
  startTime: number;
  /** 会话开始时的检查点 ID */
  startCheckpoint: string;
  /** 会话中创建的检查点 ID 列表 */
  checkpoints: string[];
  /** 会话中修改的文件 */
  modifiedFiles: string[];
}

/**
 * 会话统计
 */
export interface SessionStats {
  /** 持续时间（毫秒） */
  duration: number;
  /** 检查点数量 */
  checkpointCount: number;
  /** 修改的文件数 */
  modifiedFilesCount: number;
  /** 修改的文件列表 */
  modifiedFiles: string[];
}

/**
 * 路径验证结果
 */
export interface PathValidationResult {
  /** 是否有效 */
  valid: boolean;
  /** 原因 */
  reason?: string;
}
