/**
 * Template technology icon registry.
 *
 * Primary icon repository: Devicon v2.17.0 (MIT)
 * https://github.com/devicons/devicon
 * Assets are requested as version-pinned SVGs through jsDelivr and always have
 * a local text fallback so template browsing remains functional offline.
 */
export const DEVICON_VERSION = 'v2.17.0';
export const DEVICON_REPOSITORY_URL = 'https://github.com/devicons/devicon';
const DEVICON_CDN_ROOT = `https://cdn.jsdelivr.net/gh/devicons/devicon@${DEVICON_VERSION}/icons`;

export type TechnologyIconSpec = { src?: string; label: string; fallback: string };

const icon = (folder: string, file: string, label: string, fallback: string): TechnologyIconSpec => ({
  src: `${DEVICON_CDN_ROOT}/${folder}/${file}.svg`, label, fallback,
});

const LANGUAGE_ICONS: Record<string, TechnologyIconSpec> = {
  python: icon('python', 'python-original', 'Python', 'Py'),
  javascript: icon('javascript', 'javascript-original', 'JavaScript', 'JS'),
  typescript: icon('typescript', 'typescript-original', 'TypeScript', 'TS'),
  jsx: icon('react', 'react-original', 'React JSX', 'JSX'),
  tsx: icon('react', 'react-original', 'React TSX', 'TSX'),
  html: icon('html5', 'html5-original', 'HTML5', '5'),
  css: icon('css3', 'css3-original', 'CSS3', 'CSS'),
  scss: icon('sass', 'sass-original', 'Sass', 'SCSS'),
  c: icon('c', 'c-original', 'C', 'C'),
  cpp: icon('cplusplus', 'cplusplus-original', 'C++', 'C++'),
  java: icon('java', 'java-original', 'Java', 'J'),
  php: icon('php', 'php-original', 'PHP', 'PHP'),
  go: icon('go', 'go-original-wordmark', 'Go', 'Go'),
  rust: icon('rust', 'rust-original', 'Rust', 'Rs'),
  r: icon('r', 'r-original', 'R', 'R'),
  ruby: icon('ruby', 'ruby-original', 'Ruby', 'Rb'),
  shell: icon('bash', 'bash-original', 'Bash', '$_'),
  markdown: icon('markdown', 'markdown-original', 'Markdown', 'MD'),
  latex: icon('latex', 'latex-original', 'LaTeX', 'TeX'),
};

const FRAMEWORK_ICONS: Array<[RegExp, TechnologyIconSpec]> = [
  [/react/iu, icon('react', 'react-original', 'React', '⚛')],
  [/vue/iu, icon('vuejs', 'vuejs-original', 'Vue.js', 'V')],
  [/svelte/iu, icon('svelte', 'svelte-original', 'Svelte', 'S')],
  [/next(?:\.js)?/iu, icon('nextjs', 'nextjs-original', 'Next.js', 'N')],
  [/vite/iu, icon('vitejs', 'vitejs-original', 'Vite', 'V')],
  [/django/iu, icon('django', 'django-plain', 'Django', 'Dj')],
  [/fastapi/iu, icon('fastapi', 'fastapi-original', 'FastAPI', 'FA')],
  [/flask/iu, icon('flask', 'flask-original', 'Flask', 'Fl')],
  [/express/iu, icon('express', 'express-original', 'Express', 'Ex')],
  [/node(?:\.js)?/iu, icon('nodejs', 'nodejs-original', 'Node.js', 'Node')],
  [/tailwind/iu, icon('tailwindcss', 'tailwindcss-original', 'Tailwind CSS', 'TW')],
  [/bootstrap/iu, icon('bootstrap', 'bootstrap-original', 'Bootstrap', 'B')],
];

export function resolveTechnologyIcon(input: { framework?: string; languageId?: string; languageLabel?: string; fallback?: string }): TechnologyIconSpec {
  const framework = input.framework?.trim() || '';
  for (const [pattern, spec] of FRAMEWORK_ICONS) if (pattern.test(framework)) return spec;
  const languageId = input.languageId?.trim().toLowerCase() || '';
  return LANGUAGE_ICONS[languageId] || { label: input.languageLabel || 'Project', fallback: input.fallback || input.languageLabel?.slice(0, 3) || '</>' };
}
