// wall-e/tools/lsp-language.js
// Ported from OpenCode (https://github.com/anomalyco/opencode)
// Source: packages/opencode/src/lsp/language.ts
// Direct port of extension -> languageId map used by VS Code and LSP servers.
'use strict';

const LANGUAGE_EXTENSIONS = {
  '.abap': 'abap',
  '.bat': 'bat',
  '.bib': 'bibtex',
  '.bibtex': 'bibtex',
  '.clj': 'clojure',
  '.cljs': 'clojure',
  '.cljc': 'clojure',
  '.edn': 'clojure',
  '.coffee': 'coffeescript',
  '.c': 'c',
  '.cpp': 'cpp',
  '.cxx': 'cpp',
  '.cc': 'cpp',
  '.c++': 'cpp',
  '.cs': 'csharp',
  '.css': 'css',
  '.d': 'd',
  '.pas': 'pascal',
  '.pascal': 'pascal',
  '.diff': 'diff',
  '.patch': 'diff',
  '.dart': 'dart',
  '.dockerfile': 'dockerfile',
  '.ex': 'elixir',
  '.exs': 'elixir',
  '.erl': 'erlang',
  '.ets': 'typescript',
  '.hrl': 'erlang',
  '.fs': 'fsharp',
  '.fsi': 'fsharp',
  '.fsx': 'fsharp',
  '.fsscript': 'fsharp',
  '.gitcommit': 'git-commit',
  '.gitrebase': 'git-rebase',
  '.go': 'go',
  '.groovy': 'groovy',
  '.gleam': 'gleam',
  '.hbs': 'handlebars',
  '.handlebars': 'handlebars',
  '.hs': 'haskell',
  '.lhs': 'haskell',
  '.html': 'html',
  '.htm': 'html',
  '.ini': 'ini',
  '.java': 'java',
  '.jl': 'julia',
  '.js': 'javascript',
  '.kt': 'kotlin',
  '.kts': 'kotlin',
  '.jsx': 'javascriptreact',
  '.json': 'json',
  '.tex': 'latex',
  '.latex': 'latex',
  '.less': 'less',
  '.lua': 'lua',
  '.makefile': 'makefile',
  'makefile': 'makefile',
  '.md': 'markdown',
  '.markdown': 'markdown',
  '.m': 'objective-c',
  '.mm': 'objective-cpp',
  '.pl': 'perl',
  '.pm': 'perl',
  '.pm6': 'perl6',
  '.php': 'php',
  '.ps1': 'powershell',
  '.psm1': 'powershell',
  '.pug': 'jade',
  '.jade': 'jade',
  '.py': 'python',
  '.r': 'r',
  '.cshtml': 'razor',
  '.razor': 'razor',
  '.rb': 'ruby',
  '.rake': 'ruby',
  '.gemspec': 'ruby',
  '.ru': 'ruby',
  '.erb': 'erb',
  '.html.erb': 'erb',
  '.js.erb': 'erb',
  '.css.erb': 'erb',
  '.json.erb': 'erb',
  '.rs': 'rust',
  '.scss': 'scss',
  '.sass': 'sass',
  '.scala': 'scala',
  '.shader': 'shaderlab',
  '.sh': 'shellscript',
  '.bash': 'shellscript',
  '.zsh': 'shellscript',
  '.ksh': 'shellscript',
  '.sql': 'sql',
  '.svelte': 'svelte',
  '.swift': 'swift',
  '.ts': 'typescript',
  '.tsx': 'typescriptreact',
  '.mts': 'typescript',
  '.cts': 'typescript',
  '.mtsx': 'typescriptreact',
  '.ctsx': 'typescriptreact',
  '.xml': 'xml',
  '.xsl': 'xsl',
  '.yaml': 'yaml',
  '.yml': 'yaml',
  '.mjs': 'javascript',
  '.cjs': 'javascript',
  '.vue': 'vue',
  '.zig': 'zig',
  '.zon': 'zig',
  '.astro': 'astro',
  '.ml': 'ocaml',
  '.mli': 'ocaml',
  '.tf': 'terraform',
  '.tfvars': 'terraform-vars',
  '.hcl': 'hcl',
  '.nix': 'nix',
  '.typ': 'typst',
  '.typc': 'typst',
};

/**
 * Get the LSP languageId for a file extension.
 * @param {string} ext - File extension (e.g., '.ts')
 * @returns {string} LSP languageId or 'plaintext'
 */
function getLanguageId(ext) {
  return LANGUAGE_EXTENSIONS[ext] || 'plaintext';
}

module.exports = { LANGUAGE_EXTENSIONS, getLanguageId };
