import type { Extension } from '@codemirror/state';
import { resolveProjectLanguage, type ProjectLanguageId } from '@learnitive/project-runtime';

export type ProjectEditorLanguageId = Exclude<ProjectLanguageId, 'latex'>;
export type ProjectEditorLanguage = { id: ProjectEditorLanguageId; label: string };

export function resolveProjectEditorLanguage(path: string): ProjectEditorLanguage {
  const normalized = String(path || '').toLowerCase().replaceAll('\\', '/');
  const leaf = normalized.slice(normalized.lastIndexOf('/') + 1);
  if (leaf.endsWith('.vue')) return { id: 'html', label: 'Vue' };
  if (leaf.endsWith('.svelte')) return { id: 'html', label: 'Svelte' };
  const resolved = resolveProjectLanguage(path);
  if (!resolved || resolved.id === 'latex') return { id: 'plain', label: resolved?.label ?? 'Text' };
  return { id: resolved.id, label: resolved.label };
}

export async function loadProjectLanguageExtension(id: ProjectEditorLanguageId): Promise<Extension> {
  switch (id) {
    case 'javascript': case 'jsx': case 'typescript': case 'tsx': case 'html': case 'css': case 'scss': case 'json':
      return (await import('./project-languages/web')).projectWebLanguage(id);
    case 'python': case 'php': case 'shell': case 'r': case 'ruby':
      return (await import('./project-languages/scripting')).projectScriptingLanguage(id);
    case 'c': case 'cpp': case 'java': case 'rust': case 'go':
      return (await import('./project-languages/compiled')).projectCompiledLanguage(id);
    case 'yaml': case 'sql': case 'toml': case 'markdown':
      return (await import('./project-languages/data')).projectDataLanguage(id);
    case 'plain':
      return [];
  }
}
