/**
 * Git 深度集成类型定义
 *
 * 参考 aider 的实现
 */

/**
 * Git 配置
 */
export interface GitConfig {
  /** 是否启用 Git 集成 */
  enabled: boolean;
  /** 自动提交配置 */
  autoCommit: AutoCommitConfig;
  /** Undo 配置 */
  undo: UndoConfig;
  /** Commit message 格式配置 */
  messageFormat: MessageFormatConfig;
  /** 属性配置 */
  attribution: AttributionConfig;
}

/**
 * 自动提交配置
 */
export interface AutoCommitConfig {
  /** 是否启用自动提交 */
  enabled: boolean;
  /** 提交模式 */
  mode: 'immediate' | 'batch' | 'manual';
  /** batch 模式下的延迟 (ms) */
  batchDelay: number;
  /** 排除的文件模式 */
  excludePatterns: string[];
  /** 是否在编辑前提交脏文件 */
  dirtyCommits: boolean;
}

/**
 * Undo 配置
 */
export interface UndoConfig {
  /** 最大历史记录数 */
  maxHistory: number;
}

/**
 * Commit message 格式配置
 */
export interface MessageFormatConfig {
  /** 格式风格 */
  style: 'conventional' | 'simple' | 'detailed';
  /** 是否包含文件列表 */
  includeFileList: boolean;
  /** 最大长度 */
  maxLength: number;
  /** 是否使用 AI 生成 */
  useAI: boolean;
  /** 提交消息语言 */
  language?: string;
}

/**
 * 属性配置 (作者/提交者署名)
 */
export interface AttributionConfig {
  /** 是否在作者名添加标记 */
  attributeAuthor: boolean;
  /** 是否在提交者名添加标记 */
  attributeCommitter: boolean;
  /** 是否添加 Co-authored-by */
  coAuthoredBy: boolean;
  /** 标记名称 */
  markerName: string;
}

/**
 * Git 仓库状态
 */
export interface GitStatus {
  /** 当前分支 */
  branch: string;
  /** 领先远程的提交数 */
  ahead: number;
  /** 落后远程的提交数 */
  behind: number;
  /** 暂存的文件 */
  staged: FileChange[];
  /** 未暂存的修改 */
  unstaged: FileChange[];
  /** 未跟踪的文件 */
  untracked: string[];
  /** 是否有冲突 */
  hasConflicts: boolean;
  /** 冲突文件 */
  conflicts: string[];
  /** 是否为脏状态 */
  isDirty: boolean;
}

/**
 * 文件变更
 */
export interface FileChange {
  /** 文件路径 */
  path: string;
  /** 变更状态 */
  status: ChangeStatus;
  /** 添加行数 */
  additions: number;
  /** 删除行数 */
  deletions: number;
  /** 原路径 (重命名时) */
  oldPath?: string;
}

/**
 * 变更状态
 */
export type ChangeStatus =
  | 'added'
  | 'modified'
  | 'deleted'
  | 'renamed'
  | 'copied'
  | 'untracked';

/**
 * 提交信息
 */
export interface CommitInfo {
  /** 完整哈希 */
  hash: string;
  /** 短哈希 */
  shortHash: string;
  /** 提交消息 */
  message: string;
  /** 作者名 */
  author: string;
  /** 作者邮箱 */
  email: string;
  /** 提交时间 */
  date: Date;
  /** 涉及的文件 */
  files: string[];
  /** 是否由 AI 生成 */
  isAIGenerated: boolean;
}

/**
 * Diff 结果
 */
export interface DiffResult {
  /** 文件差异列表 */
  files: FileDiff[];
  /** 统计信息 */
  stats: DiffStats;
}

/**
 * 文件差异
 */
export interface FileDiff {
  /** 文件路径 */
  path: string;
  /** 原路径 */
  oldPath?: string;
  /** 变更状态 */
  status: ChangeStatus;
  /** 差异块 */
  hunks: DiffHunk[];
  /** 是否为二进制文件 */
  binary: boolean;
}

/**
 * 差异块
 */
export interface DiffHunk {
  /** 旧文件起始行 */
  oldStart: number;
  /** 旧文件行数 */
  oldLines: number;
  /** 新文件起始行 */
  newStart: number;
  /** 新文件行数 */
  newLines: number;
  /** 差异内容 */
  content: string;
}

/**
 * 差异统计
 */
export interface DiffStats {
  /** 变更文件数 */
  filesChanged: number;
  /** 插入行数 */
  insertions: number;
  /** 删除行数 */
  deletions: number;
}

/**
 * Undo 历史条目
 */
export interface UndoEntry {
  /** 条目 ID */
  id: string;
  /** 时间戳 */
  timestamp: number;
  /** 提交哈希 */
  commitHash: string;
  /** 提交消息 */
  message: string;
  /** 涉及的文件 */
  files: string[];
  /** 是否可以撤销 */
  canUndo: boolean;
}

/**
 * Undo 操作结果
 */
export interface UndoResult {
  /** 是否成功 */
  success: boolean;
  /** 结果消息 */
  message: string;
  /** 撤销的提交哈希 */
  commitHash?: string;
  /** 恢复的文件 */
  restoredFiles?: string[];
}

/**
 * 提交选项
 */
export interface CommitOptions {
  /** 提交消息 (可选，不填则自动生成) */
  message?: string;
  /** 要提交的文件 (可选，不填则提交所有暂存文件) */
  files?: string[];
  /** 是否提交所有变更 */
  all?: boolean;
  /** 是否为 AI 编辑 */
  aiEdits?: boolean;
  /** 上下文信息 (用于生成消息) */
  context?: string;
}

/**
 * 提交结果
 */
export interface CommitResult {
  /** 是否成功 */
  success: boolean;
  /** 提交哈希 */
  hash?: string;
  /** 短哈希 */
  shortHash?: string;
  /** 提交消息 */
  message?: string;
  /** 错误信息 */
  error?: string;
}

/**
 * 分支信息
 */
export interface BranchInfo {
  /** 分支名 */
  name: string;
  /** 是否为当前分支 */
  current: boolean;
  /** 远程名称 */
  remote?: string;
  /** 上游分支 */
  upstream?: string;
  /** 领先远程的提交数 */
  ahead: number;
  /** 落后远程的提交数 */
  behind: number;
}

/**
 * Git 事件类型
 */
export type GitEventType =
  | 'commit'
  | 'undo'
  | 'file_staged'
  | 'file_unstaged'
  | 'branch_switch'
  | 'pull'
  | 'push';

/**
 * Git 事件
 */
export interface GitEvent {
  type: GitEventType;
  timestamp: number;
  data: unknown;
}

/**
 * Git 事件监听器
 */
export type GitEventListener = (event: GitEvent) => void;

/**
 * 默认配置
 */
export const DEFAULT_GIT_CONFIG: GitConfig = {
  enabled: true,
  autoCommit: {
    enabled: true,
    mode: 'batch',
    batchDelay: 3000,
    excludePatterns: [
      '*.log',
      'node_modules/**',
      '.git/**',
      '.ai-assistant/**',
      '*.tmp',
      '*.swp',
    ],
    dirtyCommits: true,
  },
  undo: {
    maxHistory: 50,
  },
  messageFormat: {
    style: 'conventional',
    includeFileList: true,
    maxLength: 72,
    useAI: false,
  },
  attribution: {
    attributeAuthor: true,
    attributeCommitter: true,
    coAuthoredBy: false,
    markerName: 'ai-assistant',
  },
};
