import { useState, useMemo } from 'react' import type { Game, NuzlockeRun } from '../types' import { GameCard } from './GameCard' const GENERATION_LABELS: Record = { 1: 'Generation I', 2: 'Generation II', 3: 'Generation III', 4: 'Generation IV', 5: 'Generation V', 6: 'Generation VI', 7: 'Generation VII', 8: 'Generation VIII', 9: 'Generation IX', } interface GameGridProps { games: Game[] selectedId: number | null onSelect: (game: Game) => void runs?: NuzlockeRun[] | undefined } export function GameGrid({ games, selectedId, onSelect, runs }: GameGridProps) { const [filter, setFilter] = useState(null) const [regionFilter, setRegionFilter] = useState(null) const [hideWithActiveRun, setHideWithActiveRun] = useState(false) const [hideCompleted, setHideCompleted] = useState(false) const generations = useMemo(() => [...new Set(games.map((g) => g.generation))].sort(), [games]) const regions = useMemo(() => [...new Set(games.map((g) => g.region))].sort(), [games]) const activeRunGameIds = useMemo(() => { if (!runs) return new Set() return new Set(runs.filter((r) => r.status === 'active').map((r) => r.gameId)) }, [runs]) const completedRunGameIds = useMemo(() => { if (!runs) return new Set() return new Set(runs.filter((r) => r.status === 'completed').map((r) => r.gameId)) }, [runs]) const filtered = useMemo(() => { let result = games if (filter) result = result.filter((g) => g.generation === filter) if (regionFilter) result = result.filter((g) => g.region === regionFilter) if (hideWithActiveRun) result = result.filter((g) => !activeRunGameIds.has(g.id)) if (hideCompleted) result = result.filter((g) => !completedRunGameIds.has(g.id)) return result }, [ games, filter, regionFilter, hideWithActiveRun, hideCompleted, activeRunGameIds, completedRunGameIds, ]) const grouped = useMemo(() => { const groups: Record = {} for (const game of filtered) { ;(groups[game.generation] ??= []).push(game) } return Object.entries(groups) .map(([gen, games]) => ({ generation: Number(gen), games })) .sort((a, b) => a.generation - b.generation) }, [filtered]) const pillClass = (active: boolean) => `px-3 py-1.5 text-sm font-medium rounded-full transition-colors ${ active ? 'bg-blue-600 text-white' : 'bg-surface-2 text-text-secondary hover:bg-surface-3' }` return (
Gen: {generations.map((gen) => ( ))}
Region: {regions.map((region) => ( ))}
{runs && (
)}
{grouped.map(({ generation, games }) => (

{GENERATION_LABELS[generation] ?? `Generation ${generation}`}

{games.map((game) => ( ))}
))}
) }