/**
 * LSP 模块入口
 * 提供简化的 API 供其他模块使用
 */

import { LSPClientManager, type FileDiagnostic } from './client.js';
import { getLanguageId, isLanguageSupported } from './language.js';

// 全局 LSP 管理器实例
let lspManager: LSPClientManager | null = null;

/**
 * 初始化 LSP 系统
 */
export function initLSP(rootPath?: string): void {
  if (lspManager) {
    return;
  }
  lspManager = new LSPClientManager(rootPath);
}

/**
 * 获取 LSP 管理器实例
 */
export function getLSPManager(): LSPClientManager | null {
  return lspManager;
}

/**
 * 通知 LSP 文件已变更
 * 用于编辑/写入文件后通知语言服务器
 * @returns 是否是首次启动服务器（需要更长等待时间）
 */
export async function touchFile(filePath: string, isNew: boolean = false): Promise<boolean> {
  if (!lspManager) {
    return false;
  }

  if (!isLanguageSupported(filePath)) {
    return false;
  }

  try {
    return await lspManager.touchFile(filePath, isNew);
  } catch (error) {
    // 静默失败，LSP 是增强功能
    console.error('LSP touchFile 错误:', error);
    return false;
  }
}

/**
 * 获取所有文件的诊断信息
 */
export function getDiagnostics(): Map<string, FileDiagnostic[]> {
  if (!lspManager) {
    return new Map();
  }
  return lspManager.getDiagnostics();
}

/**
 * 获取单个文件的诊断信息
 */
export function getFileDiagnostics(filePath: string): FileDiagnostic[] {
  if (!lspManager) {
    return [];
  }
  return lspManager.getFileDiagnostics(filePath);
}

/**
 * 格式化诊断信息为字符串
 * 用于返回给 AI
 */
export function formatDiagnostics(diagnostics: FileDiagnostic[]): string {
  if (diagnostics.length === 0) {
    return '';
  }

  const lines: string[] = [];
  for (const d of diagnostics) {
    const location = `${d.line}:${d.column}`;
    const severity = d.severity.toUpperCase();
    const code = d.code ? ` [${d.code}]` : '';
    const source = d.source ? ` (${d.source})` : '';
    lines.push(`  ${location} ${severity}${code}: ${d.message}${source}`);
  }

  return lines.join('\n');
}

/**
 * 获取文件诊断并格式化为 AI 可读的格式
 * 只显示错误和警告，忽略 hint 和 info
 */
export async function getFormattedFileDiagnostics(filePath: string): Promise<string> {
  const diagnostics = getFileDiagnostics(filePath);

  // 只关注错误和警告，忽略 hint 和 info
  const errors = diagnostics.filter(d => d.severity === 'error');
  const warnings = diagnostics.filter(d => d.severity === 'warning');
  const relevantDiagnostics = [...errors, ...warnings];

  // 没有错误和警告就不显示
  if (relevantDiagnostics.length === 0) {
    return '';
  }

  let result = `\n<file_diagnostics file="${filePath}">\n`;
  result += `发现 ${errors.length} 个错误, ${warnings.length} 个警告:\n`;
  result += formatDiagnostics(relevantDiagnostics);
  result += '\n</file_diagnostics>';

  return result;
}

/**
 * 关闭 LSP 系统
 */
export async function shutdownLSP(): Promise<void> {
  if (lspManager) {
    await lspManager.shutdown();
    lspManager = null;
  }
}

// 导出类型
export type { FileDiagnostic } from './client.js';
export { getLanguageId, isLanguageSupported, getSupportedExtensions } from './language.js';
export { getServerConfig, hasServerConfig, getSupportedLanguages } from './server.js';
export { LSPClientManager } from './client.js';
