import { Head, router, usePage } from '@inertiajs/react';
import axios from 'axios';
import Echo from 'laravel-echo';
import Pusher from 'pusher-js';
import { RefreshCw, Save, Smartphone, Users } from 'lucide-react';
import { useCallback, useEffect, useState } from 'react';
import { toast } from 'sonner';
import AuthenticatedLayout from '@/layouts/AuthenticatedLayout';

interface Member { id: number; student_id: number; name: string; turn_order: number; squad_number: number }
interface Team { id: number; name: string; color: string; connected: boolean; last_seen_at?: string | null; members: Member[] }
interface Session { uuid: string; pin: string; status: string; class_name: string; game: { id: number; title: string; subject?: string } }
interface Props { session: Session; teams: Team[] }

export default function Lobby({ session, teams: initialTeams }: Props) {
    const { pusher } = usePage().props as any;
    const [teams, setTeams] = useState(initialTeams);
    const [saving, setSaving] = useState(false);
    const [dirty, setDirty] = useState(false);

    useEffect(() => {
        if (!dirty) setTeams(initialTeams);
    }, [dirty, initialTeams]);

    const refreshState = useCallback(async () => {
        const response = await axios.get(route('team-quest.host.state', session.uuid));
        if (!dirty) setTeams(response.data.teams);
    }, [dirty, session.uuid]);

    useEffect(() => {
        const timer = window.setInterval(() => void refreshState(), 2000);
        if (!pusher?.key) return () => window.clearInterval(timer);

        (window as any).Pusher = Pusher;
        const echo = new Echo({ broadcaster: 'pusher', key: pusher.key, cluster: pusher.cluster, forceTLS: true });
        const channel = echo.private(`team-quest.host.${session.uuid}`);
        channel.listen('TeamDeviceJoined', () => void refreshState());

        return () => {
            window.clearInterval(timer);
            echo.leave(`team-quest.host.${session.uuid}`);
        };
    }, [pusher, refreshState, session.uuid]);

    const moveMember = (memberId: number, sourceTeamId: number, targetTeamId: number) => {
        if (sourceTeamId === targetTeamId) return;
        setDirty(true);
        setTeams((current) => {
            const source = current.find((team) => team.id === sourceTeamId);
            const member = source?.members.find((item) => item.id === memberId);
            if (!member) return current;
            return current.map((team) => {
                if (team.id === sourceTeamId) return { ...team, members: team.members.filter((item) => item.id !== memberId) };
                if (team.id === targetTeamId) return { ...team, members: [...team.members, member] };
                return team;
            });
        });
    };

    const saveGroups = () => {
        setSaving(true);
        router.put(route('team-quest.host.groups.update', session.uuid), {
            groups: teams.map((team) => ({ name: team.name, color: team.color, student_ids: team.members.map((member) => member.student_id) })),
        }, {
            preserveScroll: true,
            onSuccess: () => {
                setDirty(false);
                toast.success('Pembagian kelompok disimpan.');
            },
            onFinish: () => setSaving(false),
        });
    };

    return (
        <AuthenticatedLayout title={`Lobby Team Quest: ${session.game.title}`}>
            <Head title={`Lobby Team Quest - ${session.game.title}`} />
            <div className="space-y-6">
                <div className="flex flex-wrap items-center justify-between gap-4">
                    <div>
                        <p className="text-text-muted">{session.game.title} · {session.class_name}</p>
                    </div>
                    <div className="rounded-2xl border border-amber-400/30 bg-amber-500/10 px-6 py-3 text-center">
                        <div className="text-xs uppercase tracking-widest text-amber-300">PIN Kelompok</div>
                        <div className="font-mono text-3xl font-black tracking-[0.3em] text-amber-200">{session.pin}</div>
                    </div>
                </div>

                <div className="grid gap-4 md:grid-cols-2 2xl:grid-cols-4">
                    {teams.map((team) => (
                        <div key={team.id} className="glass min-w-0 rounded-2xl border border-border/40 p-4">
                            <div className="mb-4 flex items-center justify-between">
                                <div>
                                    <h2 className="font-bold text-text-light">{team.name}</h2>
                                    <p className="text-xs text-text-muted">{team.members.length} anggota</p>
                                </div>
                                <span className={`inline-flex items-center gap-1 rounded-full px-2 py-1 text-xs ${team.connected ? 'bg-emerald-500/15 text-emerald-300' : 'bg-slate-500/15 text-slate-400'}`}>
                                    <Smartphone className="h-3 w-3" /> {team.connected ? 'Siap' : 'Belum join'}
                                </span>
                            </div>

                            <div className="space-y-2">
                                {team.members.map((member) => (
                                    <div key={member.id} className="rounded-xl bg-surface-hover/40 p-2">
                                        <div className="flex items-center justify-between gap-2">
                                            <div className="min-w-0">
                                                <p className="truncate text-sm font-medium">{member.name}</p>
                                                <p className="text-[10px] text-text-muted">Squad {member.squad_number}</p>
                                            </div>
                                            <select
                                                aria-label={`Pindahkan ${member.name}`}
                                                value={team.id}
                                                onChange={(event) => moveMember(member.id, team.id, Number(event.target.value))}
                                                className="max-w-24 rounded-lg border border-border/50 bg-surface px-2 py-1 text-xs"
                                            >
                                                {teams.map((target) => <option key={target.id} value={target.id}>{target.name}</option>)}
                                            </select>
                                        </div>
                                    </div>
                                ))}
                            </div>

                            {team.connected && (
                                <button
                                    type="button"
                                    onClick={() => router.post(route('team-quest.host.device.reset', [session.uuid, team.id]))}
                                    className="mt-4 inline-flex w-full items-center justify-center gap-2 rounded-lg bg-rose-500/10 px-3 py-2 text-xs text-rose-300"
                                >
                                    <RefreshCw className="h-3.5 w-3.5" /> Reset Perangkat
                                </button>
                            )}
                        </div>
                    ))}
                </div>

                <div className="flex flex-wrap items-center justify-between gap-3 rounded-2xl border border-border/40 bg-surface/70 p-4">
                    <div className="flex items-center gap-2 text-sm text-text-muted"><Users className="h-4 w-4" /> Pastikan setiap kelompok memiliki 2–10 anggota dan satu HP.</div>
                    <div className="flex flex-wrap gap-2">
                        <button type="button" onClick={saveGroups} disabled={saving} className="inline-flex items-center gap-2 rounded-xl bg-surface-hover px-5 py-2.5 font-bold text-text-light disabled:opacity-50">
                            <Save className="h-4 w-4" /> {saving ? 'Menyimpan...' : 'Simpan Pembagian'}
                        </button>
                        <button
                            type="button"
                            onClick={() => router.post(route('team-quest.host.start', session.uuid))}
                            disabled={dirty || teams.some((team) => !team.connected)}
                            className="rounded-xl bg-emerald-500 px-5 py-2.5 font-bold text-white disabled:cursor-not-allowed disabled:opacity-40"
                        >
                            Mulai Team Quest
                        </button>
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}
