import GameGrid from '@/Components/game/GameGrid';
import PublicLayout from '@/Layouts/PublicLayout';
import { cn } from '@/lib/utils';
import { GameCard, Paginated } from '@/types/models';
import { Head, Link } from '@inertiajs/react';
import { NoIndex } from '@/Components/shared/Seo';
import { Star } from 'lucide-react';

type Entry = { status: string; my_score: number | null; game: GameCard };
type Props = {
    status: string | null;
    counts: Record<string, number>;
    entries: Paginated<Entry>;
    reviews: { id: number; title: string | null; body: string; game: { title: string; slug: string } | null; created_at: string }[];
};

const TABS = [
    { value: null, label: 'All' },
    { value: 'wishlist', label: 'Want to play' },
    { value: 'playing', label: 'Playing' },
    { value: 'played', label: 'Played' },
] as const;

export default function Library({ status, counts, entries, reviews }: Props) {
    const total = Object.values(counts).reduce((a, b) => a + Number(b), 0);

    return (
        <PublicLayout>
            <Head title="My library" />
            <NoIndex />
            <div className="space-y-8">
                <header>
                    <h1 className="text-2xl font-semibold tracking-tight">My library</h1>
                    <p className="mt-1 text-sm text-muted-foreground">{total} {total === 1 ? 'game' : 'games'} tracked</p>
                </header>

                <nav className="flex gap-1 overflow-x-auto rounded-xl border border-border bg-card/60 p-1" aria-label="Library filter">
                    {TABS.map((t) => {
                        const active = status === t.value;
                        const n = t.value ? counts[t.value] ?? 0 : total;
                        return (
                            <Link key={t.label} href={route('library', t.value ? { status: t.value } : {})} preserveScroll className={cn('flex-1 whitespace-nowrap rounded-lg px-4 py-2 text-center text-sm font-medium transition', active ? 'bg-primary text-primary-foreground' : 'text-muted-foreground hover:bg-accent hover:text-foreground')}>
                                {t.label} <span className={cn('ml-1 text-xs', active ? 'opacity-80' : 'opacity-60')}>{n}</span>
                            </Link>
                        );
                    })}
                </nav>

                {entries.data.length ? (
                    <>
                        <GameGrid games={entries.data.map((e) => e.game)} />
                        {entries.meta.last_page > 1 && (
                            <div className="flex items-center justify-center gap-3 text-sm">
                                {entries.links.prev && <Link href={entries.links.prev} className="rounded-md px-3 py-1.5 hover:bg-accent">Previous</Link>}
                                <span className="text-muted-foreground">{entries.meta.current_page} / {entries.meta.last_page}</span>
                                {entries.links.next && <Link href={entries.links.next} className="rounded-md px-3 py-1.5 hover:bg-accent">Next</Link>}
                            </div>
                        )}
                    </>
                ) : (
                    <div className="rounded-xl border border-dashed border-border py-20 text-center">
                        <p className="text-sm text-muted-foreground">Nothing here yet.</p>
                        <Link href={route('catalog')} className="mt-3 inline-block text-sm font-medium underline underline-offset-4">Browse games</Link>
                    </div>
                )}

                {reviews.length > 0 && (
                    <section className="space-y-3">
                        <h2 className="text-lg font-semibold tracking-tight">Your recent reviews</h2>
                        <div className="grid gap-3 md:grid-cols-2">
                            {reviews.map((r) => (
                                <Link key={r.id} href={r.game ? route('games.show', r.game.slug) : '#'} className="rounded-xl border border-border bg-card/60 p-4 transition hover:bg-accent/40">
                                    <p className="flex items-center gap-1.5 text-sm font-medium"><Star className="size-3.5 fill-amber-400 text-amber-400" />{r.game?.title}</p>
                                    {r.title && <p className="mt-1 text-sm">{r.title}</p>}
                                    <p className="mt-1 line-clamp-2 text-sm text-muted-foreground">{r.body}</p>
                                </Link>
                            ))}
                        </div>
                    </section>
                )}
            </div>
        </PublicLayout>
    );
}
