import { Head, useForm } from '@inertiajs/react';
import { Users } from 'lucide-react';
import AuthenticatedLayout from '@/layouts/AuthenticatedLayout';

interface Props {
    game: { id: number; title: string; subject?: { name: string } };
    classes: Array<{ id: number; name: string; students_count: number; students: Array<{ id: number; full_name: string }> }>;
}

export default function Setup({ game, classes }: Props) {
    const { data, setData, post, processing, errors } = useForm({
        synced_class_id: classes[0]?.id ?? '',
        team_count: 4,
        absent_student_ids: [] as number[],
    });

    const selectedClass = classes.find((item) => item.id === Number(data.synced_class_id));
    const activeStudentCount = selectedClass ? selectedClass.students_count - data.absent_student_ids.length : 0;
    const estimatedSize = activeStudentCount ? Math.ceil(activeStudentCount / data.team_count) : 0;

    const toggleAbsent = (studentId: number) => {
        setData('absent_student_ids', data.absent_student_ids.includes(studentId)
            ? data.absent_student_ids.filter((id) => id !== studentId)
            : [...data.absent_student_ids, studentId]);
    };

    return (
        <AuthenticatedLayout title={`Setup Team Quest: ${game.title}`} backHref="/games">
            <Head title={`Setup Team Quest - ${game.title}`} />
            <div className="mx-auto max-w-2xl space-y-6">
                <div>
                    <p className="mt-1 text-text-muted">{game.title} · {game.subject?.name}</p>
                </div>

                <form
                    onSubmit={(event) => {
                        event.preventDefault();
                        post(route('team-quest.host.sessions.store', game.id));
                    }}
                    className="glass space-y-6 rounded-2xl border border-border/40 p-6"
                >
                    <div>
                        <label className="mb-2 block text-sm font-medium">Kelas</label>
                        <select
                            value={data.synced_class_id}
                            onChange={(event) => {
                                setData((current) => ({ ...current, synced_class_id: Number(event.target.value), absent_student_ids: [] }));
                            }}
                            className="w-full rounded-xl border border-border/50 bg-surface px-4 py-3"
                        >
                            {classes.map((item) => (
                                <option key={item.id} value={item.id}>{item.name} · {item.students_count} siswa aktif</option>
                            ))}
                        </select>
                        {errors.synced_class_id && <p className="mt-1 text-sm text-rose-400">{errors.synced_class_id}</p>}
                    </div>

                    <div>
                        <div className="mb-2 flex items-center justify-between gap-2">
                            <label className="block text-sm font-medium">Siswa tidak hadir</label>
                            <span className="text-xs text-text-muted">{data.absent_student_ids.length} ditandai</span>
                        </div>
                        <div className="max-h-52 space-y-1 overflow-y-auto rounded-xl border border-border/50 bg-surface/60 p-2">
                            {selectedClass?.students.map((student) => (
                                <label key={student.id} className="flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2 hover:bg-surface-hover/50">
                                    <input
                                        type="checkbox"
                                        checked={data.absent_student_ids.includes(student.id)}
                                        onChange={() => toggleAbsent(student.id)}
                                        className="rounded border-border text-rose-500"
                                    />
                                    <span className={data.absent_student_ids.includes(student.id) ? 'text-text-muted line-through' : 'text-text-light'}>{student.full_name}</span>
                                </label>
                            ))}
                        </div>
                    </div>

                    <div>
                        <label className="mb-2 block text-sm font-medium">Jumlah Kelompok</label>
                        <div className="grid grid-cols-4 gap-2">
                            {[2, 3, 4, 5, 6, 7, 8].map((count) => (
                                <button
                                    key={count}
                                    type="button"
                                    onClick={() => setData('team_count', count)}
                                    className={`rounded-xl border px-4 py-3 font-bold ${data.team_count === count ? 'border-emerald-400 bg-emerald-500/20 text-emerald-300' : 'border-border/50 bg-surface text-text-muted'}`}
                                >
                                    {count}
                                </button>
                            ))}
                        </div>
                        {errors.team_count && <p className="mt-1 text-sm text-rose-400">{errors.team_count}</p>}
                    </div>

                    <div className="rounded-xl border border-sky-500/20 bg-sky-500/10 p-4 text-sm text-sky-200">
                        <div className="flex items-center gap-2 font-semibold"><Users className="h-4 w-4" /> Perkiraan pembagian</div>
                        <p className="mt-1">{activeStudentCount} siswa aktif, sekitar {estimatedSize} siswa per kelompok. Kelompok di atas 5 siswa otomatis dibagi menjadi dua mini-squad.</p>
                    </div>

                    <button disabled={processing || classes.length === 0} className="w-full rounded-xl bg-emerald-500 px-5 py-3 font-bold text-white disabled:opacity-50">
                        {processing ? 'Membuat kelompok...' : 'Buat Kelompok Otomatis'}
                    </button>
                </form>
            </div>
        </AuthenticatedLayout>
    );
}
