/**
 * fileType.ts — ファイル名から拡張子・種別カテゴリ・表示色を導く純関数。
 *
 * ファイルタブで (a) 種別ごとの色付きアイコン表示、(b) 長い名前でも拡張子を
 * 常に見せる中間省略表示、の両方に使う。
 */

export type FileCategory =
  | 'image'
  | 'pdf'
  | 'spreadsheet'
  | 'document'
  | 'presentation'
  | 'code'
  | 'archive'
  | 'audio'
  | 'video'
  | 'other';

/**
 * ファイル名を「本体」と「拡張子」に分割する。拡張子には先頭の `.` を含む。
 * - `report.xlsx` → { stem: 'report', ext: '.xlsx' }
 * - `archive.tar.gz` → { stem: 'archive.tar', ext: '.gz' }（最後のドット基準）
 * - `.gitignore`（ドットファイル）→ { stem: '.gitignore', ext: '' }
 * - `README`（拡張子なし）→ { stem: 'README', ext: '' }
 */
export function splitFileName(name: string): { stem: string; ext: string } {
  const dot = name.lastIndexOf('.');
  if (dot <= 0) return { stem: name, ext: '' }; // 先頭ドット(ドットファイル) or ドット無し
  return { stem: name.slice(0, dot), ext: name.slice(dot) };
}

// 拡張子(小文字・ドット無し) → カテゴリ
const EXT_CATEGORY: Record<string, FileCategory> = {};
const register = (cat: FileCategory, exts: string[]) => {
  for (const e of exts) EXT_CATEGORY[e] = cat;
};
register('image', ['png', 'jpg', 'jpeg', 'gif', 'webp', 'svg', 'bmp', 'ico', 'avif', 'tif', 'tiff', 'heic']);
register('pdf', ['pdf']);
register('spreadsheet', ['xlsx', 'xls', 'xlsm', 'csv', 'tsv', 'ods']);
register('document', ['doc', 'docx', 'odt', 'rtf', 'txt', 'md', 'markdown', 'log']);
register('presentation', ['ppt', 'pptx', 'odp', 'key']);
register('code', [
  'ts', 'tsx', 'js', 'jsx', 'mjs', 'cjs', 'py', 'rb', 'go', 'rs', 'java', 'kt',
  'c', 'cc', 'cpp', 'h', 'hpp', 'cs', 'php', 'swift', 'sh', 'bash', 'zsh', 'sql',
  'json', 'yaml', 'yml', 'toml', 'xml', 'html', 'htm', 'css', 'scss', 'less', 'ipynb',
]);
register('archive', ['zip', 'tar', 'gz', 'tgz', 'rar', '7z', 'bz2', 'xz', 'zst']);
register('audio', ['mp3', 'wav', 'ogg', 'flac', 'm4a', 'aac', 'opus']);
register('video', ['mp4', 'mov', 'avi', 'mkv', 'webm', 'm4v']);

export function fileCategory(name: string): FileCategory {
  const { ext } = splitFileName(name);
  if (!ext) return 'other';
  return EXT_CATEGORY[ext.slice(1).toLowerCase()] ?? 'other';
}

// Tailwind の content スキャンに拾わせるため、色クラスはリテラル文字列で持つ
// (動的に `text-${x}-500` を組み立てると JIT が purge する)。
const CATEGORY_COLOR: Record<FileCategory, string> = {
  image: 'text-cyan-500',
  pdf: 'text-red-500',
  spreadsheet: 'text-green-600',
  document: 'text-blue-500',
  presentation: 'text-orange-500',
  code: 'text-indigo-500',
  archive: 'text-amber-500',
  audio: 'text-purple-500',
  video: 'text-pink-500',
  other: 'text-slate-400',
};

export function categoryColorClass(cat: FileCategory): string {
  return CATEGORY_COLOR[cat];
}
