import { confirmAction } from '@/lib/confirm-action';
import React from 'react';
import { Head, Link, router, usePage } from '@inertiajs/react';
import { Gamepad2, Plus, Edit, Trash2, BarChart2, Flame, Users, Play, StopCircle } from 'lucide-react';
import AuthenticatedLayout from '@/layouts/AuthenticatedLayout';
import type { PageProps } from '@/types';
import { useState } from 'react';
import ConfirmDeleteModal from '@/components/ConfirmDeleteModal';
import LearningContentFilters from '@/components/LearningContentFilters';

interface GameProps extends PageProps {
    subjects: Array<{ id: number; name: string }>;
    selectedSubject: number | null;
    games: {
        data: Array<{
            id: number;
            title: string;
            subject: { name: string };
            classes: Array<{ name: string }>;
            mode: string;
            game_mode: string;
            status: string;
            active_team_quest_sessions: Array<{
                uuid: string;
                status: 'waiting' | 'question_active' | 'revealing' | 'leaderboard';
                updated_at: string;
                synced_class?: { name: string } | null;
            }>;
        }>;
        links: Array<{ url: string | null; label: string; active: boolean }>;
        last_page: number;
        total: number;
    };
}

export default function Index() {
    const { games, subjects, selectedSubject } = usePage<GameProps>().props;
    const emptyMessage = selectedSubject ? 'Tidak ada quiz untuk mata pelajaran ini. Pilih mapel lain atau Semua Mata Pelajaran.' : 'Belum ada quiz yang dibuat.';
    const [deleteConfig, setDeleteConfig] = useState<{isOpen: boolean, url: string} | null>(null);
    const [endingSessionUuid, setEndingSessionUuid] = useState<string | null>(null);

    const handleDelete = (id: number) => {
        setDeleteConfig({
            isOpen: true,
            url: route('games.destroy', id)
        });
    };

    const modeLabel = (mode: string) => ({ serious: 'Serius', live: 'Live Arena', faction: 'Faction', team_live: 'Team Quest' }[mode] ?? mode);
    const modeClass = (mode: string) => mode === 'live' ? 'text-orange-400' : mode === 'team_live' ? 'text-emerald-400' : mode === 'faction' ? 'text-blue-400' : 'text-primary-400';
    const teamQuestStatusLabel = (status: string) => ({
        waiting: 'Menunggu di Lobby',
        question_active: 'Soal Berlangsung',
        revealing: 'Reveal Jawaban',
        leaderboard: 'Leaderboard',
    }[status] ?? status);
    const teamQuestHostRoute = (session: { uuid: string; status: string }) => (
        route(session.status === 'waiting' ? 'team-quest.host.lobby' : 'team-quest.host.play', session.uuid)
    );
    const handleEndSession = async (session: { uuid: string; synced_class?: { name: string } | null }, gameTitle: string) => {
        const className = session.synced_class?.name ? ` untuk kelas ${session.synced_class.name}` : '';
        if (!(await confirmAction(`Yakin ingin mengakhiri sesi "${gameTitle}"${className}?`))) {
            return;
        }

        setEndingSessionUuid(session.uuid);
        router.post(
            route('team-quest.host.end', session.uuid),
            { return_to: 'games' },
            {
                preserveScroll: true,
                onFinish: () => setEndingSessionUuid(null),
            },
        );
    };

    return (
        <>
            <Head title="Quiz Arena" />

            <div className="mb-6 flex items-center justify-between">
                <div>
                    <p className="text-sm text-text-muted">Kelola bank soal gamifikasi dan lihat hasilnya.</p>
                </div>
                <Link
                    href={route('games.create')}
                    className="flex items-center gap-2 rounded-xl bg-primary-600 px-4 py-2 text-sm font-medium text-white transition-colors hover:bg-primary-500"
                >
                    <Plus className="h-4 w-4" />
                    Buat Quiz
                </Link>
            </div>

            {/* Desktop Table */}
            <div className="mb-6">
                <LearningContentFilters baseUrl="/games" subjects={subjects} selectedSubject={selectedSubject} showPeriod={false} />
                <p className="mt-3 text-xs text-text-muted" role="status">{games.total} quiz ditemukan</p>
            </div>

            <div className="hidden sm:block glass rounded-2xl overflow-hidden border border-border/40">
                <div className="overflow-x-auto">
                    <table className="w-full text-left text-sm text-text-muted">
                        <thead className="bg-surface-hover/30 text-xs uppercase text-text-light">
                            <tr>
                                <th className="px-6 py-4">Judul Quiz</th>
                                <th className="px-6 py-4">Mapel & Kelas</th>
                                <th className="px-6 py-4">Status</th>
                                <th className="px-6 py-4 text-right">Aksi</th>
                            </tr>
                        </thead>
                        <tbody className="divide-y divide-border/40">
                            {games.data.length > 0 ? (
                                games.data.map((game) => (
                                    <tr key={game.id} className="hover:bg-surface-hover/20">
                                        <td className="px-6 py-4 font-medium text-text-light">
                                            {game.title}
                                            <div className="text-xs text-text-muted mt-1">
                                                Mode: <span className={`${modeClass(game.game_mode)} font-bold`}>{modeLabel(game.game_mode)}</span>
                                            </div>
                                        </td>
                                        <td className="px-6 py-4">
                                            {game.subject.name}
                                            <div className="flex flex-wrap gap-1 mt-1">
                                                {game.classes?.map((c, i) => (
                                                    <span key={i} className="bg-slate-700/50 text-xs px-2 py-0.5 rounded-full border border-slate-600/50 text-slate-300">{c.name}</span>
                                                ))}
                                            </div>
                                        </td>
                                        <td className="px-6 py-4">
                                            <span className={`inline-flex items-center rounded-md px-2 py-1 text-xs font-medium ring-1 ring-inset ${
                                                game.status === 'published' 
                                                    ? 'bg-emerald-500/10 text-emerald-400 ring-emerald-500/20' 
                                                    : 'bg-amber-500/10 text-amber-400 ring-amber-500/20'
                                            }`}>
                                                {game.status}
                                            </span>
                                            {game.active_team_quest_sessions.length > 0 && (
                                                <div className="mt-2 space-y-1.5">
                                                    {game.active_team_quest_sessions.map((session) => (
                                                        <div key={session.uuid} className="w-fit rounded-lg border border-amber-500/30 bg-amber-500/10 px-2.5 py-1.5 text-xs">
                                                            <div className="font-bold text-amber-300">Sesi Aktif · {teamQuestStatusLabel(session.status)}</div>
                                                            {session.synced_class?.name && <div className="mt-0.5 text-text-muted">{session.synced_class.name}</div>}
                                                        </div>
                                                    ))}
                                                </div>
                                            )}
                                        </td>
                                        <td className="px-6 py-4 whitespace-nowrap">
                                            <div className="flex flex-wrap justify-end gap-2">
                                            {game.game_mode === 'live' && game.status === 'published' && (
                                                <Link
                                                    href={route('host.lobby', game.id)}
                                                    className="inline-flex items-center gap-1 text-orange-400 hover:text-white hover:bg-orange-500 transition-colors bg-orange-500/10 px-3 py-1.5 rounded-lg border border-orange-500/30 font-bold"
                                                >
                                                    <Flame className="h-4 w-4" />
                                                    <span>Host Live</span>
                                                </Link>
                                            )}
                                            {game.game_mode === 'team_live' && game.status === 'published' && game.active_team_quest_sessions.length === 0 && (
                                                <Link
                                                    href={route('team-quest.host.setup', game.id)}
                                                    className="inline-flex items-center gap-1 text-emerald-400 hover:text-white hover:bg-emerald-500 transition-colors bg-emerald-500/10 px-3 py-1.5 rounded-lg border border-emerald-500/30 font-bold"
                                                >
                                                    <Users className="h-4 w-4" />
                                                    <span>Host Team</span>
                                                </Link>
                                            )}
                                            {game.active_team_quest_sessions.map((session) => (
                                                <div key={session.uuid} className="inline-flex items-center gap-1">
                                                    <Link
                                                        href={teamQuestHostRoute(session)}
                                                        className="inline-flex items-center gap-1 rounded-lg border border-sky-500/30 bg-sky-500/10 px-3 py-1.5 font-bold text-sky-300 transition-colors hover:bg-sky-500 hover:text-white"
                                                    >
                                                        <Play className="h-4 w-4" />
                                                        <span>Lanjutkan</span>
                                                    </Link>
                                                    <button
                                                        type="button"
                                                        onClick={() => handleEndSession(session, game.title)}
                                                        disabled={endingSessionUuid === session.uuid}
                                                        className="inline-flex items-center gap-1 rounded-lg border border-rose-500/30 bg-rose-500/10 px-3 py-1.5 font-bold text-rose-300 transition-colors hover:bg-rose-500 hover:text-white disabled:cursor-wait disabled:opacity-50"
                                                    >
                                                        <StopCircle className="h-4 w-4" />
                                                        <span>{endingSessionUuid === session.uuid ? 'Mengakhiri...' : 'Akhiri'}</span>
                                                    </button>
                                                </div>
                                            ))}
                                            <Link
                                                href={route('games.report', game.id)}
                                                className="inline-flex items-center gap-1 text-primary-400 hover:text-primary-300 transition-colors bg-primary-500/10 px-3 py-1.5 rounded-lg"
                                            >
                                                <BarChart2 className="h-4 w-4" />
                                                <span>Report</span>
                                            </Link>
                                            {game.active_team_quest_sessions.length === 0 ? (
                                                <Link
                                                    href={route('games.edit', game.id)}
                                                    className="inline-flex items-center text-text-muted hover:text-amber-400 transition-colors p-1.5"
                                                >
                                                    <Edit className="h-4 w-4" />
                                                </Link>
                                            ) : (
                                                <span title="Akhiri semua sesi aktif sebelum mengedit game." className="inline-flex cursor-not-allowed items-center p-1.5 text-text-muted opacity-40">
                                                    <Edit className="h-4 w-4" />
                                                </span>
                                            )}
                                            <button
                                                onClick={() => handleDelete(game.id)}
                                                disabled={game.active_team_quest_sessions.length > 0}
                                                title={game.active_team_quest_sessions.length > 0 ? 'Akhiri semua sesi aktif sebelum menghapus game.' : 'Hapus game'}
                                                className="inline-flex items-center text-text-muted hover:text-rose-400 transition-colors p-1.5 disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:text-text-muted"
                                            >
                                                <Trash2 className="h-4 w-4" />
                                            </button>
                                            </div>
                                        </td>
                                    </tr>
                                ))
                            ) : (
                                <tr>
                                    <td colSpan={4} className="px-6 py-12 text-center text-text-muted">
                                        <Gamepad2 className="mx-auto h-12 w-12 opacity-20 mb-3" />
                                        <p>{emptyMessage}</p>
                                    </td>
                                </tr>
                            )}
                        </tbody>
                    </table>
                </div>
            </div>

            {/* Mobile Cards */}
            <div className="sm:hidden grid gap-4">
                {games.data.length > 0 ? (
                    games.data.map((game) => (
                        <div key={game.id} className="glass rounded-xl p-4 border border-border/40 flex flex-col gap-3">
                            <div className="flex justify-between items-start gap-2">
                                <div className="flex-1 min-w-0">
                                    <h3 className="font-bold text-text-light text-base truncate">{game.title}</h3>
                                    <div className="text-xs text-text-muted mt-1">
                                        Mode: <span className={`${modeClass(game.game_mode)} font-bold`}>{modeLabel(game.game_mode)}</span>
                                    </div>
                                </div>
                                <span className={`shrink-0 inline-flex items-center rounded-md px-2 py-1 text-[10px] font-medium ring-1 ring-inset ${
                                    game.status === 'published' 
                                        ? 'bg-emerald-500/10 text-emerald-400 ring-emerald-500/20' 
                                        : 'bg-amber-500/10 text-amber-400 ring-amber-500/20'
                                }`}>
                                    {game.status}
                                </span>
                            </div>

                            <div className="bg-surface-hover/30 rounded-lg p-3">
                                <div className="text-sm text-text-light font-medium">{game.subject.name}</div>
                                <div className="flex flex-wrap gap-1.5 mt-2">
                                    {game.classes?.map((c, i) => (
                                        <span key={i} className="bg-slate-700/50 text-[10px] px-2 py-0.5 rounded-full border border-slate-600/50 text-slate-300">
                                            {c.name}
                                        </span>
                                    ))}
                                </div>
                            </div>

                            {game.active_team_quest_sessions.length > 0 && (
                                <div className="space-y-2">
                                    {game.active_team_quest_sessions.map((session) => (
                                        <div key={session.uuid} className="rounded-xl border border-amber-500/30 bg-amber-500/10 p-3">
                                            <div className="font-bold text-amber-300">Sesi Aktif · {teamQuestStatusLabel(session.status)}</div>
                                            {session.synced_class?.name && <div className="mt-0.5 text-xs text-text-muted">{session.synced_class.name}</div>}
                                            <div className="mt-3 grid grid-cols-2 gap-2">
                                                <Link
                                                    href={teamQuestHostRoute(session)}
                                                    className="inline-flex items-center justify-center gap-1.5 rounded-lg border border-sky-500/30 bg-sky-500/10 px-3 py-2 text-xs font-bold text-sky-300"
                                                >
                                                    <Play className="h-4 w-4" />
                                                    Lanjutkan
                                                </Link>
                                                <button
                                                    type="button"
                                                    onClick={() => handleEndSession(session, game.title)}
                                                    disabled={endingSessionUuid === session.uuid}
                                                    className="inline-flex items-center justify-center gap-1.5 rounded-lg border border-rose-500/30 bg-rose-500/10 px-3 py-2 text-xs font-bold text-rose-300 disabled:cursor-wait disabled:opacity-50"
                                                >
                                                    <StopCircle className="h-4 w-4" />
                                                    {endingSessionUuid === session.uuid ? 'Mengakhiri...' : 'Akhiri'}
                                                </button>
                                            </div>
                                        </div>
                                    ))}
                                </div>
                            )}

                            <div className="flex items-center justify-between gap-2 mt-1">
                                <div className="flex items-center gap-2 flex-1">
                                    {game.game_mode === 'live' && game.status === 'published' && (
                                        <Link
                                            href={route('host.lobby', game.id)}
                                            className="inline-flex items-center gap-1.5 text-orange-400 hover:text-white hover:bg-orange-500 transition-colors bg-orange-500/10 px-3 py-2 rounded-lg border border-orange-500/30 font-bold justify-center text-xs flex-1"
                                        >
                                            <Flame className="h-4 w-4" />
                                            <span>Host Live</span>
                                        </Link>
                                    )}
                                    {game.game_mode === 'team_live' && game.status === 'published' && game.active_team_quest_sessions.length === 0 && (
                                        <Link
                                            href={route('team-quest.host.setup', game.id)}
                                            className="inline-flex items-center gap-1.5 text-emerald-400 hover:text-white hover:bg-emerald-500 transition-colors bg-emerald-500/10 px-3 py-2 rounded-lg border border-emerald-500/30 font-bold justify-center text-xs flex-1"
                                        >
                                            <Users className="h-4 w-4" />
                                            <span>Host Team</span>
                                        </Link>
                                    )}
                                    <Link
                                        href={route('games.report', game.id)}
                                        className={`inline-flex items-center gap-1.5 text-primary-400 hover:text-primary-300 transition-colors bg-primary-500/10 px-3 py-2 rounded-lg justify-center text-xs ${game.game_mode === 'live' && game.status === 'published' ? '' : 'flex-1'}`}
                                    >
                                        <BarChart2 className="h-4 w-4" />
                                        <span>Report</span>
                                    </Link>
                                </div>
                                <div className="flex items-center gap-2 shrink-0">
                                    {game.active_team_quest_sessions.length === 0 ? (
                                        <Link
                                            href={route('games.edit', game.id)}
                                            className="inline-flex items-center text-text-muted hover:text-amber-400 transition-colors p-2 bg-surface hover:bg-surface-hover rounded-lg border border-border/40"
                                        >
                                            <Edit className="h-4 w-4" />
                                        </Link>
                                    ) : (
                                        <span title="Akhiri semua sesi aktif sebelum mengedit game." className="inline-flex cursor-not-allowed items-center rounded-lg border border-border/40 bg-surface p-2 text-text-muted opacity-40">
                                            <Edit className="h-4 w-4" />
                                        </span>
                                    )}
                                    <button
                                        onClick={() => handleDelete(game.id)}
                                        disabled={game.active_team_quest_sessions.length > 0}
                                        title={game.active_team_quest_sessions.length > 0 ? 'Akhiri semua sesi aktif sebelum menghapus game.' : 'Hapus game'}
                                        className="inline-flex items-center text-text-muted hover:text-rose-400 transition-colors p-2 bg-surface hover:bg-surface-hover rounded-lg border border-border/40 disabled:cursor-not-allowed disabled:opacity-40 disabled:hover:text-text-muted"
                                    >
                                        <Trash2 className="h-4 w-4" />
                                    </button>
                                </div>
                            </div>
                        </div>
                    ))
                ) : (
                    <div className="glass rounded-xl p-8 text-center text-text-muted border border-border/40">
                        <Gamepad2 className="mx-auto h-12 w-12 opacity-20 mb-3" />
                        <p className="text-sm">{emptyMessage}</p>
                    </div>
                )}
            </div>

            {games.last_page > 1 && (
                <nav aria-label="Halaman quiz" className="mt-6 flex flex-wrap justify-center gap-2">
                    {games.links.map((link, index) => link.url ? (
                        <Link key={index} href={link.url} preserveScroll className={`rounded-xl px-3 py-2 text-sm ${link.active ? 'bg-primary-500 font-bold text-white' : 'bg-surface text-text hover:bg-surface-hover'}`} aria-current={link.active ? 'page' : undefined} dangerouslySetInnerHTML={{ __html: link.label }} />
                    ) : (
                        <span key={index} className="rounded-xl bg-surface px-3 py-2 text-sm text-text-muted opacity-50" dangerouslySetInnerHTML={{ __html: link.label }} />
                    ))}
                </nav>
            )}

            {deleteConfig && (
                <ConfirmDeleteModal
                    isOpen={deleteConfig.isOpen}
                    onClose={() => setDeleteConfig(null)}
                    onConfirm={() => router.delete(deleteConfig.url)}
                    title="Hapus Game"
                    message="Apakah Anda yakin ingin menghapus game ini? Semua rekaman nilai game ini akan hilang."
                />
            )}
        </>
    );
}

Index.layout = (page: any) => <AuthenticatedLayout title="Quiz Arena">{page}</AuthenticatedLayout>;
