import { createHighlighter } from 'shiki';
import { escapeHtml } from './escape-html.js';

let highlighterPromise = null;

/**
 * 代码语言别名映射表
 * 用于将用户输入的语言标识符映射到 Shiki 支持的语言
 */
const CODE_LANGUAGE_ALIASES = {
  // 类型和语言别名
  types: 'typescript',
  type: 'typescript',
  javascript: 'js',
  typescript: 'ts',
  shell: 'bash',
  markdown: 'md',
  sh: 'bash',
  zsh: 'bash',
  py: 'python',
  html5: 'html',
  yml: 'yaml',
  css3: 'css',
  jsx: 'tsx',
  json5: 'json',
  csharp: 'cs',
  react: 'tsx',
  node: 'js',
  vue: 'html',
  sass: 'scss',
  echarts: 'json',
  // 常见的不支持语言映射到 plaintext
  code: 'plaintext',
  txt: 'plaintext',
  mermaid: 'plaintext',
  // Mermaid 图表语法
  plantuml: 'plaintext',
  // PlantUML 图表语法
  flowchart: 'plaintext',
  // 流程图语法
  diagram: 'plaintext',
  // 通用图表语法
  pseudocode: 'plaintext',
  // 伪代码
  algorithm: 'plaintext',
  // 算法描述
  config: 'plaintext',
  // 通用配置文件
  log: 'plaintext',
  // 日志文件
  output: 'plaintext',
  // 输出内容
  console: 'plaintext',
  // 控制台输出
  terminal: 'plaintext' // 终端输出
};

/**
 * Shiki 支持的代码语言列表
 * 包含基础语言、常用前端语言、脚本和配置语言、CSS预处理器、后端语言、其他常用语言
 */
const CODE_LANGUAGES_SUPPORTED = [
// 基础语言（必须包含）
'plaintext',
// 作为回退语言，必须放在前面
'text',
// 常用前端语言
'javascript', 'js', 'typescript', 'ts', 'tsx', 'jsx', 'css', 'html', 'json',
// 脚本和配置语言
'bash', 'shell', 'sh', 'zsh', 'markdown', 'md', 'yaml', 'yml', 'toml', 'diff',
// CSS预处理器
'scss', 'less', 'sass',
// 后端语言
'python', 'py', 'sql', 'java', 'csharp', 'cs', 'php', 'go', 'rust', 'ruby', 'rb', 'kotlin', 'swift',
// 其他常用语言
'c', 'cpp', 'dart', 'xml', 'graphql'];

/**
 * Shiki 支持的代码主题列表
 * 包含 GitHub 风格的浅色和深色主题，以及默认和高对比度选项
 */
const CODE_THEMES = ['github-light', 'github-dark', 'github-dark-default', 'github-dark-dimmed', 'github-dark-high-contrast'];

/**
 * 获取 Shiki highlighter 的单例实例。
 * 首次调用时进行异步初始化。
 */
async function getHighlighterInstance() {
  if (!highlighterPromise) {
    try {
      highlighterPromise = createHighlighter({
        themes: CODE_THEMES,
        langs: CODE_LANGUAGES_SUPPORTED
      });
    } catch (error) {
      console.error('[SyntaxHighlighter] Failed to create highlighter:', error);
      highlighterPromise = Promise.reject(error);
    }
  }
  return highlighterPromise;
}

/**
 * 使用 Shiki 高亮代码。
 */
function highlightCode(highlighter, code, language) {
  try {
    const mappedLanguage = CODE_LANGUAGE_ALIASES[language] || language;
    return highlighter.codeToHtml(code, {
      lang: mappedLanguage,
      theme: 'github-light'
    });
  } catch {
    // 回退到 plaintext 高亮
    try {
      return highlighter.codeToHtml(code, {
        lang: 'plaintext',
        theme: 'github-light'
      });
    } catch (fallbackError) {
      console.error('[SyntaxHighlighter] Even plaintext highlighting failed:', fallbackError);
      // 最后的回退：返回简单的 pre/code 包装
      return `<pre><code>${escapeHtml(code)}</code></pre>`;
    }
  }
}

export { getHighlighterInstance, highlightCode };
