/**
 * RepoMap 类型定义
 * 基于 Aider 的 RepoMap 实现
 */

/**
 * 代码标签 - 对应 Aider 的 Tag
 */
export interface Tag {
  /** 相对路径 */
  relFname: string;
  /** 绝对路径 */
  fname: string;
  /** 行号 (0-indexed, -1 表示未知) */
  line: number;
  /** 符号名称 */
  name: string;
  /** 定义或引用 */
  kind: 'def' | 'ref';
}

/**
 * 文件缓存条目
 */
export interface TagCacheEntry {
  /** 文件修改时间 (ms) */
  mtime: number;
  /** 标签数据 */
  data: Tag[];
}

/**
 * RepoMap 配置
 */
export interface RepoMapConfig {
  /** 目标 token 数量 */
  mapTokens: number;
  /** 无聊天文件时的乘数 */
  mapMulNoFiles: number;
  /** 最大上下文窗口 */
  maxContextWindow: number;
  /** 刷新策略 */
  refresh: 'auto' | 'always' | 'files' | 'manual';
  /** 缓存目录 */
  cacheDir: string;
  /** 是否详细输出 */
  verbose: boolean;
  /** 排除的文件模式 */
  exclude: string[];
  /** 包含的文件模式 */
  include: string[];
}

/**
 * 默认配置
 */
export const DEFAULT_REPOMAP_CONFIG: RepoMapConfig = {
  mapTokens: 2048,
  mapMulNoFiles: 8,
  maxContextWindow: 128000,
  refresh: 'auto',
  cacheDir: '.ai-assist/tags-cache',
  verbose: false,
  exclude: [
    'node_modules/**',
    'dist/**',
    'build/**',
    '.git/**',
    '*.test.*',
    '*.spec.*',
    '**/*.d.ts',
  ],
  include: ['**/*.ts', '**/*.tsx', '**/*.js', '**/*.jsx', '**/*.py'],
};

/**
 * 图边
 */
export interface GraphEdge {
  /** 引用文件 */
  from: string;
  /** 定义文件 */
  to: string;
  /** 边权重 */
  weight: number;
  /** 符号名 */
  ident: string;
}

/**
 * 排序后的定义
 */
export interface RankedDefinition {
  fname: string;
  ident: string;
  rank: number;
  tags: Tag[];
}

/**
 * PageRank 算法配置
 */
export interface PageRankOptions {
  /** 阻尼系数 (默认 0.85) */
  damping?: number;
  /** 最大迭代次数 (默认 100) */
  maxIterations?: number;
  /** 收敛容差 (默认 1e-6) */
  tolerance?: number;
  /** 个性化向量 */
  personalization?: Map<string, number>;
}

/**
 * 支持的语言映射
 */
export const LANGUAGE_MAP: Record<string, string> = {
  '.ts': 'typescript',
  '.tsx': 'typescript',
  '.js': 'javascript',
  '.jsx': 'javascript',
  '.mjs': 'javascript',
  '.cjs': 'javascript',
  '.py': 'python',
  '.go': 'go',
  '.rs': 'rust',
  '.java': 'java',
  '.rb': 'ruby',
  '.cpp': 'cpp',
  '.cc': 'cpp',
  '.c': 'c',
  '.h': 'c',
  '.hpp': 'cpp',
};

/**
 * 获取文件语言
 */
export function getLanguageFromFilename(filename: string): string | null {
  const ext = filename.substring(filename.lastIndexOf('.')).toLowerCase();
  return LANGUAGE_MAP[ext] || null;
}
