/**
 * 编辑模式类型定义
 *
 * 支持多种编辑模式：
 * - whole: 整文件替换
 * - search-replace: 搜索替换（支持多块）
 * - diff: 统一 diff 格式（未来扩展）
 */

/**
 * 编辑模式类型
 */
export type EditMode = 'whole' | 'search-replace' | 'diff';

/**
 * 单个搜索替换块
 */
export interface SearchReplaceBlock {
  /** 要搜索的原始字符串 */
  search: string;
  /** 替换后的新字符串 */
  replace: string;
}

/**
 * 编辑操作（通用接口）
 */
export interface EditOperation {
  /** 编辑模式 */
  mode: EditMode;
  /** 目标文件路径 */
  filePath: string;
}

/**
 * 整文件替换操作
 */
export interface WholeFileEdit extends EditOperation {
  mode: 'whole';
  /** 新的文件内容 */
  content: string;
}

/**
 * 搜索替换操作
 */
export interface SearchReplaceEdit extends EditOperation {
  mode: 'search-replace';
  /** 替换块列表 */
  blocks: SearchReplaceBlock[];
}

/**
 * Diff 格式操作（统一 diff）
 */
export interface DiffEdit extends EditOperation {
  mode: 'diff';
  /** 统一 diff 格式的补丁内容 */
  patch: string;
}

/**
 * 所有编辑操作的联合类型
 */
export type Edit = WholeFileEdit | SearchReplaceEdit | DiffEdit;

/**
 * 编辑验证结果
 */
export interface EditValidationResult {
  /** 是否有效 */
  valid: boolean;
  /** 错误信息列表 */
  errors: EditValidationError[];
  /** 警告信息列表 */
  warnings: EditValidationWarning[];
}

/**
 * 验证错误
 */
export interface EditValidationError {
  /** 错误类型 */
  type: 'not_found' | 'ambiguous' | 'conflict' | 'syntax' | 'permission';
  /** 错误消息 */
  message: string;
  /** 相关的搜索字符串（如果适用） */
  search?: string;
  /** 在文件中找到的匹配数量（如果适用） */
  occurrences?: number;
  /** 行号（如果适用） */
  line?: number;
}

/**
 * 验证警告
 */
export interface EditValidationWarning {
  /** 警告类型 */
  type: 'whitespace' | 'large_change' | 'binary';
  /** 警告消息 */
  message: string;
}

/**
 * 编辑应用结果
 */
export interface EditApplyResult {
  /** 是否成功 */
  success: boolean;
  /** 目标文件路径 */
  filePath: string;
  /** 原始内容 */
  originalContent?: string;
  /** 新内容 */
  newContent?: string;
  /** 错误信息 */
  error?: string;
  /** 变更统计 */
  stats?: EditStats;
  /** 代码诊断结果（如果启用 LSP） */
  diagnostics?: string;
}

/**
 * 编辑统计
 */
export interface EditStats {
  /** 新增行数 */
  additions: number;
  /** 删除行数 */
  deletions: number;
  /** 修改的块数 */
  blocksApplied: number;
}

/**
 * 编辑预览
 */
export interface EditPreview {
  /** 文件路径 */
  filePath: string;
  /** 是否是新文件 */
  isNewFile: boolean;
  /** 原始内容（null 表示新文件） */
  originalContent: string | null;
  /** 预览的新内容 */
  previewContent: string;
  /** 变更统计 */
  stats: EditStats;
  /** Diff hunks（用于显示） */
  hunks: DiffHunk[];
}

/**
 * Diff Hunk（差异块）
 */
export interface DiffHunk {
  /** 原文件起始行 */
  oldStart: number;
  /** 原文件行数 */
  oldLines: number;
  /** 新文件起始行 */
  newStart: number;
  /** 新文件行数 */
  newLines: number;
  /** 变更行 */
  changes: DiffChange[];
}

/**
 * Diff 变更行
 */
export interface DiffChange {
  /** 变更类型 */
  type: 'add' | 'remove' | 'context';
  /** 行内容 */
  content: string;
  /** 原文件行号（删除和上下文行有效） */
  oldLineNumber?: number;
  /** 新文件行号（新增和上下文行有效） */
  newLineNumber?: number;
}

/**
 * 批量编辑操作
 */
export interface BatchEdit {
  /** 编辑列表 */
  edits: Edit[];
  /** 是否原子操作（全部成功或全部回滚） */
  atomic?: boolean;
}

/**
 * 批量编辑结果
 */
export interface BatchEditResult {
  /** 是否全部成功 */
  success: boolean;
  /** 各个编辑的结果 */
  results: EditApplyResult[];
  /** 总体统计 */
  totalStats: EditStats;
}

/**
 * 编辑器配置
 */
export interface EditorConfig {
  /** 默认编辑模式 */
  defaultMode: EditMode;
  /** 是否启用 LSP 诊断 */
  enableDiagnostics: boolean;
  /** 大文件阈值（超过此字节数使用 search-replace 模式） */
  largeFileThreshold: number;
  /** 是否在应用前验证 */
  validateBeforeApply: boolean;
  /** 是否创建备份 */
  createBackup: boolean;
  /** 备份目录 */
  backupDir?: string;
}

/**
 * 默认编辑器配置
 */
export const DEFAULT_EDITOR_CONFIG: EditorConfig = {
  defaultMode: 'search-replace',
  enableDiagnostics: true,
  largeFileThreshold: 100 * 1024, // 100KB
  validateBeforeApply: true,
  createBackup: false,
};
