import GameCard from '@/Components/game/GameCard';
import { GameCardSkeleton } from '@/Components/game/GameSkeleton';
import RatingBadge from '@/Components/game/RatingBadge';
import ReviewCard from '@/Components/game/ReviewCard';
import StarRating from '@/Components/game/StarRating';
import EmptyState from '@/Components/shared/EmptyState';
import { Badge } from '@/Components/ui/badge';
import { Button } from '@/Components/ui/button';
import { Field, Input, Textarea } from '@/Components/ui/field';
import { Sheet } from '@/Components/ui/sheet';
import { Skeleton } from '@/Components/ui/skeleton';
import { useToast } from '@/Components/ui/toast';
import PublicLayout from '@/Layouts/PublicLayout';
import { GameCard as G, ReviewItem } from '@/types/models';
import { Head } from '@inertiajs/react';
import { Gamepad2 } from 'lucide-react';
import { useState } from 'react';

const game: G = { id: 1, title: 'Hollow Meridian', slug: 'x', summary: 'A quiet, atmospheric RPG about a cartographer mapping a drowned kingdom.', release_date: '2024-05-12', rating_avg: 8.6, rating_count: 1204, cover: null, genres: [{ name: 'RPG', slug: 'rpg' }, { name: 'Adventure', slug: 'a' }], platforms: [{ short_name: 'PC', slug: 'pc' }, { short_name: 'PS5', slug: 'ps5' }] };
const review: ReviewItem = { id: 1, title: 'Patient, beautiful, unforgettable', body: 'It asks you to slow down, and rewards you for it. The soundtrack alone is worth the price of admission, and the way the map fills in as you listen to NPCs is quietly brilliant. '.repeat(3), contains_spoilers: false, score: 9, created_at: '2025-02-01', user: { name: 'Ada Lovelace', username: 'ada', avatar: null } };

const SWATCHES = ['background', 'card', 'secondary', 'muted', 'accent', 'primary', 'border', 'destructive'];

function Block({ title, children }: { title: string; children: React.ReactNode }) {
    return (
        <section className="space-y-4 border-t border-border pt-8">
            <h2 className="text-overline">{title}</h2>
            {children}
        </section>
    );
}

export default function Design() {
    const { toast } = useToast();
    const [sheet, setSheet] = useState(false);
    const [score, setScore] = useState<number | null>(7);

    return (
        <PublicLayout>
            <Head title="Design system" />
            <div className="space-y-10">
                <header>
                    <p className="text-overline">Aether</p>
                    <h1 className="text-display mt-3">Design system</h1>
                    <p className="text-body mt-3 max-w-xl text-muted-foreground">Tokens, type, and components. Local only. Press ⌘K to try the command palette.</p>
                </header>

                <Block title="Colour">
                    <div className="grid grid-cols-2 gap-3 sm:grid-cols-4">
                        {SWATCHES.map((s) => (
                            <div key={s} className="overflow-hidden rounded-xl border border-border">
                                <div className="h-14" style={{ background: `var(--${s})` }} />
                                <p className="px-3 py-2 text-xs">{s}</p>
                            </div>
                        ))}
                    </div>
                </Block>

                <Block title="Typography">
                    <div className="space-y-3">
                        <p className="text-display">Display 64</p>
                        <p className="text-h1">Heading one</p>
                        <p className="text-h2">Heading two</p>
                        <p className="text-h3">Heading three</p>
                        <p className="text-body max-w-prose">Body copy sits at fifteen pixels with generous leading so long descriptions stay comfortable to read in dark mode.</p>
                        <p className="text-caption">Caption · metadata · 2024</p>
                        <p className="text-overline">Overline</p>
                    </div>
                </Block>

                <Block title="Buttons & badges">
                    <div className="flex flex-wrap items-center gap-3">
                        <Button>Primary</Button><Button variant="secondary">Secondary</Button><Button variant="ghost">Ghost</Button><Button variant="danger">Danger</Button><Button loading>Loading</Button><Button size="sm">Small</Button><Button size="lg">Large</Button>
                    </div>
                    <div className="flex flex-wrap gap-2"><Badge>Default</Badge><Badge variant="accent">Accent</Badge><Badge variant="outline">Outline</Badge><Badge variant="glass">Glass</Badge><RatingBadge value={8.6} count={1204} /></div>
                </Block>

                <Block title="Inputs">
                    <div className="grid max-w-xl gap-4">
                        <Field label="Title" hint="Helper text"><Input placeholder="Placeholder" /></Field>
                        <Field label="With error" error="This field is required."><Input aria-invalid /></Field>
                        <Field label="Review"><Textarea placeholder="What stayed with you?" /></Field>
                    </div>
                </Block>

                <Block title="Rating">
                    <div className="flex items-center gap-4"><StarRating value={score} onChange={setScore} /><span className="text-sm">{score ?? '—'}/10</span></div>
                </Block>

                <Block title="Game card · grid / featured / list">
                    <div className="grid gap-6 md:grid-cols-[220px_1fr]">
                        <GameCard game={game} />
                        <GameCard game={game} variant="featured" />
                    </div>
                    <GameCard game={game} variant="list" />
                </Block>

                <Block title="Review card"><div className="max-w-2xl space-y-3"><ReviewCard review={review} /><ReviewCard review={{ ...review, id: 2, contains_spoilers: true, title: null, body: 'The final act reframes everything.' }} /></div></Block>

                <Block title="Skeletons">
                    <div className="grid grid-cols-2 gap-4 sm:grid-cols-4"><GameCardSkeleton /><GameCardSkeleton /><Skeleton className="h-24" /><Skeleton className="h-24" /></div>
                </Block>

                <Block title="Empty state"><EmptyState icon={Gamepad2} title="Nothing here yet" description="Games you mark as played will appear here." action={<Button variant="secondary">Browse games</Button>} /></Block>

                <Block title="Toast & sheet">
                    <div className="flex flex-wrap gap-3">
                        <Button variant="secondary" onClick={() => toast({ title: 'Review saved', description: 'Thanks for sharing.' })}>Success</Button>
                        <Button variant="secondary" onClick={() => toast({ kind: 'error', title: 'Something went wrong' })}>Error</Button>
                        <Button variant="secondary" onClick={() => toast({ kind: 'info', title: 'Heads up', description: 'Informational toast.' })}>Info</Button>
                        <Button variant="secondary" onClick={() => setSheet(true)}>Open sheet</Button>
                    </div>
                    <Sheet open={sheet} onClose={() => setSheet(false)} title="Sheet"><p className="text-sm text-muted-foreground">Bottom sheet on mobile, drawer on desktop.</p></Sheet>
                </Block>
            </div>
        </PublicLayout>
    );
}
