import type { SystemDef, SystemId, MediaType } from "./types";

export const SYSTEMS: Record<SystemId, SystemDef> = {
  nes: {
    id: "nes",
    name: "Nintendo Entertainment System",
    shortName: "NES",
    core: "nes",
    media: "cartridge",
    extensions: [".nes", ".zip"],
    color: "#c0392b",
  },
  snes: {
    id: "snes",
    name: "Super Nintendo",
    shortName: "SNES",
    core: "snes",
    media: "cartridge",
    extensions: [".sfc", ".smc", ".zip"],
    color: "#8e44ad",
  },
  gb: {
    id: "gb",
    name: "Game Boy",
    shortName: "GB",
    core: "gb",
    media: "handheld",
    extensions: [".gb", ".zip"],
    color: "#7f8c8d",
  },
  gbc: {
    id: "gbc",
    name: "Game Boy Color",
    shortName: "GBC",
    core: "gb",
    media: "handheld",
    extensions: [".gbc", ".zip"],
    color: "#f39c12",
  },
  gba: {
    id: "gba",
    name: "Game Boy Advance",
    shortName: "GBA",
    core: "gba",
    media: "handheld",
    extensions: [".gba", ".zip"],
    color: "#2980b9",
  },
  genesis: {
    id: "genesis",
    name: "Sega Genesis / Mega Drive",
    shortName: "Genesis",
    core: "segaMD",
    media: "cartridge",
    extensions: [".md", ".gen", ".bin", ".zip"],
    color: "#1abc9c",
  },
  n64: {
    id: "n64",
    name: "Nintendo 64",
    shortName: "N64",
    core: "n64",
    media: "cartridge",
    extensions: [".n64", ".z64", ".v64", ".zip"],
    color: "#27ae60",
  },
  psx: {
    id: "psx",
    name: "PlayStation",
    shortName: "PS1",
    core: "psx",
    media: "disc",
    extensions: [".bin", ".cue", ".chd", ".pbp", ".zip"],
    color: "#34495e",
  },
  arcade: {
    id: "arcade",
    name: "Arcade",
    shortName: "Arcade",
    core: "arcade",
    media: "arcade",
    extensions: [".zip"],
    color: "#e74c3c",
  },
  nds: {
    id: "nds",
    name: "Nintendo DS",
    shortName: "NDS",
    core: "nds",
    media: "handheld",
    extensions: [".nds", ".zip"],
    color: "#3498db",
  },
  psp: {
    id: "psp",
    name: "PlayStation Portable",
    shortName: "PSP",
    core: "psp",
    media: "handheld",
    extensions: [".iso", ".cso", ".pbp", ".zip"],
    color: "#2c3e50",
  },
  sms: {
    id: "sms",
    name: "Sega Master System",
    shortName: "SMS",
    core: "segaMS",
    media: "cartridge",
    extensions: [".sms", ".zip"],
    color: "#16a085",
  },
  gg: {
    id: "gg",
    name: "Game Gear",
    shortName: "GG",
    core: "segaGG",
    media: "handheld",
    extensions: [".gg", ".zip"],
    color: "#d35400",
  },
  saturn: {
    id: "saturn",
    name: "Sega Saturn",
    shortName: "Saturn",
    core: "segaSaturn",
    media: "disc",
    extensions: [".bin", ".cue", ".chd", ".zip"],
    color: "#9b59b6",
  },
  segacd: {
    id: "segacd",
    name: "Sega CD",
    shortName: "Sega CD",
    core: "segaCD",
    media: "disc",
    extensions: [".bin", ".cue", ".chd", ".zip"],
    color: "#c0392b",
  },
  atari2600: {
    id: "atari2600",
    name: "Atari 2600",
    shortName: "2600",
    core: "atari2600",
    media: "cartridge",
    extensions: [".a26", ".bin", ".zip"],
    color: "#e67e22",
  },
  vb: {
    id: "vb",
    name: "Virtual Boy",
    shortName: "VB",
    core: "vb",
    media: "cartridge",
    extensions: [".vb", ".zip"],
    color: "#c0392b",
  },
};

export const SYSTEM_LIST = Object.values(SYSTEMS);

export function getSystem(id: string): SystemDef | undefined {
  return SYSTEMS[id as SystemId];
}

export function mediaForSystem(id: SystemId): MediaType {
  return SYSTEMS[id].media;
}

export function detectSystemFromFilename(filename: string): SystemId | null {
  const lower = filename.toLowerCase();
  const ext = lower.slice(lower.lastIndexOf("."));
  for (const sys of SYSTEM_LIST) {
    if (sys.extensions.includes(ext)) {
      // Prefer more specific handhelds
      if (ext === ".gbc") return "gbc";
      if (ext === ".gba") return "gba";
      if (ext === ".gb") return "gb";
      if (ext === ".nds") return "nds";
      if (ext === ".gg") return "gg";
      if (ext === ".sms") return "sms";
      return sys.id;
    }
  }
  return null;
}
