import { Link, Head, router } from '@inertiajs/react';
import { useState } from 'react';
import { CheckSquare, AlertCircle, Clock, FileSignature, Download, Search, School, BookOpen, User, Filter } from 'lucide-react';
import AuthenticatedLayout from '@/layouts/AuthenticatedLayout';
import PeriodSelector from '@/components/PeriodSelector';
import SubjectFilter from '@/components/SubjectFilter';
import { formatDate, cn } from '@/lib/utils';
import { evaluateKktp } from '@/lib/kktp';
import type { PageProps, AcademicYearWithSemesters } from '@/types';

interface Submission {
    id: number;
    assignment_id: number;
    student_id: number;
    status: string;
    submitted_at: string;
    class_name: string;
    is_late: boolean;
    student: {
        id: number;
        full_name: string; // Fixed bug from student.name to student.full_name
    };
    assignment: {
        id: number;
        title: string;
        due_date: string;
        material: {
            title: string;
            subject: {
                name: string;
            } | null;
            synced_class: {
                name: string;
            } | null;
        };
    };
}

interface SyncedClass {
    id: number;
    name: string;
}

interface Subject {
    id: number;
    name: string;
}

interface SyncedStudent {
    id: number;
    nisn: string;
    full_name: string;
    gender: string;
}

interface SimpleAssignment {
    id: number;
    title: string;
    max_points: number;
}

interface SubmissionRecord {
    assignment_id: number;
    student_id: number;
    status: string;
    grade: number | null;
    is_late: boolean;
}

interface RecapData {
    students: SyncedStudent[];
    assignments: SimpleAssignment[];
    submissions: SubmissionRecord[];
}

interface Props extends PageProps {
    submissions: Submission[];
    classes: SyncedClass[];
    subjects: Subject[];
    recapData: RecapData | null;
    filters: {
        class_id: string | null;
        subject_id: string | null;
    };
    periods?: AcademicYearWithSemesters[];
    selectedPeriod?: number | null;
    pendingSubjects: Subject[];
    selectedPendingSubject: number | null;
}

export default function GradeIndex({ submissions, classes, subjects, recapData, filters, periods, selectedPeriod, pendingSubjects, selectedPendingSubject }: Props) {
    const [activeTab, setActiveTab] = useState<'pending' | 'recap'>(filters.class_id ? 'recap' : 'pending');
    const [selectedClass, setSelectedClass] = useState(filters.class_id || '');
    const [selectedSubject, setSelectedSubject] = useState(filters.subject_id || '');

    const getStatusLabel = (status: string, isLate = false, compact = false) => {
        switch (status) {
            case 'pending':
                return <span className={cn(
                    "inline-flex items-center bg-amber-500/10 text-amber-400 ring-1 ring-inset ring-amber-500/20",
                    compact ? "rounded-full px-2 py-1 text-[10px] font-bold" : "rounded-md px-2.5 py-0.5 text-xs font-medium"
                )}>{compact ? 'Menunggu' : 'Menunggu Penilaian'}{isLate ? ' · Terlambat' : ''}</span>;
            case 'late':
                return <span className={cn(
                    "inline-flex items-center bg-rose-500/10 text-rose-400 ring-1 ring-inset ring-rose-500/20",
                    compact ? "rounded-full px-2 py-1 text-[10px] font-bold" : "rounded-md px-2.5 py-0.5 text-xs font-medium"
                )}>{compact ? 'Terlambat' : 'Terlambat (Belum Dinilai)'}</span>;
            case 'physical_submitted':
                return <span className={cn(
                    "inline-flex items-center bg-blue-500/10 text-blue-400 ring-1 ring-inset ring-blue-500/20",
                    compact ? "rounded-full px-2 py-1 text-[10px] font-bold" : "rounded-md px-2.5 py-0.5 text-xs font-medium"
                )}>{compact ? 'Tugas Fisik' : 'Tugas Fisik (Belum Dinilai)'}</span>;
            default:
                return <span className="capitalize">{status}</span>;
        }
    };

    const handleFilter = (e: React.FormEvent) => {
        e.preventDefault();
        router.get('/grades', {
            class_id: selectedClass,
            subject_id: selectedSubject,
            academic_year_id: selectedPeriod || '',
            pending_subject_id: selectedPendingSubject ?? '',
        }, {
            preserveState: true,
            only: ['recapData', 'filters']
        });
    };

    // Helper to find submission grade/status in matrix
    const getGradeCell = (studentId: number, assignmentId: number) => {
        if (!recapData) return '-';
        const sub = recapData.submissions.find(s => s.student_id === studentId && s.assignment_id === assignmentId);
        if (!sub) return <span className="text-text-muted opacity-40">-</span>;
        if (sub.status === 'graded') {
            const kktp = evaluateKktp(sub.grade);
            return (
                <span
                    className={cn(
                        'inline-flex items-center justify-center font-bold px-2 py-0.5 rounded-md text-xs tabular-nums transition-colors',
                        kktp ? kktp.badgeClass : 'text-text-light font-bold'
                    )}
                    title={kktp ? `${kktp.predikat} (${sub.grade}): ${kktp.ketercapaian}` : undefined}
                >
                    {sub.grade}
                </span>
            );
        }
        
        // Status pending/late/physical
        if (sub.status === 'physical_submitted') return <span className="text-blue-400 text-xs font-semibold">Fisik</span>;
        return <span className="text-amber-400 text-xs font-semibold">Kumpul</span>;
    };

    // Calculate student average
    const getStudentAverage = (studentId: number) => {
        if (!recapData || recapData.assignments.length === 0) return '-';
        const studentSubs = recapData.submissions.filter(s => s.student_id === studentId && s.status === 'graded');
        if (studentSubs.length === 0) return '-';
        const sum = studentSubs.reduce((acc, curr) => acc + (curr.grade || 0), 0);
        const avg = sum / studentSubs.length;
        const kktp = evaluateKktp(avg);
        return (
            <span
                className={cn(
                    'inline-flex items-center justify-center font-black text-xs px-2 py-0.5 rounded-md tabular-nums',
                    kktp ? kktp.badgeClass : 'text-primary-300'
                )}
                title={kktp ? `Rata-rata: ${avg.toFixed(1)} (${kktp.predikat})` : undefined}
            >
                {avg.toFixed(1)}
            </span>
        );
    };

    return (
        <>
            <Head title="Penilaian & Koreksi" />

            <div className="space-y-6">
                {/* Tabs */}
                <div className="flex justify-center mb-6">
                    <div className="flex gap-2 p-1.5 bg-surface/40 rounded-2xl w-fit border border-border/40">
                        <button
                            onClick={() => setActiveTab('pending')}
                            className={cn(
                                "rounded-xl px-6 py-2.5 text-sm font-bold transition-all",
                                activeTab === 'pending'
                                    ? "bg-primary-500 text-white shadow-lg shadow-primary-500/30"
                                    : "text-text-muted hover:bg-surface-hover hover:text-text-light"
                            )}
                        >
                            Perlu Dikoreksi ({submissions.length})
                        </button>
                        <button
                            onClick={() => setActiveTab('recap')}
                            className={cn(
                                "rounded-xl px-6 py-2.5 text-sm font-bold transition-all",
                                activeTab === 'recap'
                                    ? "bg-primary-500 text-white shadow-lg shadow-primary-500/30"
                                    : "text-text-muted hover:bg-surface-hover hover:text-text-light"
                            )}
                        >
                            Rekap Nilai (Gradebook)
                        </button>
                    </div>
                </div>

                {activeTab === 'pending' ? (
                    <div className="space-y-6">
                        <div className="flex items-center justify-between">
                            <div>
                                <p className="text-sm text-text-muted">
                                    Total: {submissions.length} tugas menunggu penilaian
                                </p>
                            </div>
                        </div>

                        <div className="glass rounded-2xl p-3 sm:p-4">
                            <div className="sm:max-w-xs">
                                <SubjectFilter subjects={pendingSubjects} value={selectedPendingSubject} onChange={(value) => {
                                    router.get('/grades', {
                                        academic_year_id: selectedPeriod ?? '',
                                        ...filters,
                                        pending_subject_id: value,
                                    }, { preserveState: true, preserveScroll: true, replace: true });
                                }} />
                            </div>
                        </div>

                        {/* Mobile submission inbox */}
                        <div className="grid grid-cols-1 gap-3 md:hidden">
                            {submissions.length > 0 ? (
                                submissions.map((submission) => (
                                    <article key={submission.id} className="glass rounded-xl border-l-2 border-l-primary-500 p-3 text-[10px]">
                                        <div className="flex items-start gap-2.5">
                                            <div className="flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-primary-500/10 text-primary-400">
                                                <User className="h-4 w-4" />
                                            </div>
                                            <div className="min-w-0 flex-1 pt-0.5">
                                                <h2 className="truncate text-sm font-bold text-text-light">
                                                    {submission.student.full_name}
                                                </h2>
                                                <p className="mt-0.5 truncate text-[11px] leading-none text-text-muted">Kelas {submission.class_name}</p>
                                            </div>

                                            <Link
                                                href={`/assignments/${submission.assignment_id}/review?student_id=${submission.student_id}`}
                                                aria-label={`Koreksi tugas ${submission.assignment.title} milik ${submission.student.full_name}`}
                                                className="inline-flex min-h-9 shrink-0 items-center gap-1.5 rounded-lg bg-primary-500 px-3 py-2 text-[11px] font-bold text-white shadow-sm shadow-primary-500/20 transition-colors hover:bg-primary-400 focus:outline-none focus-visible:ring-2 focus-visible:ring-primary-300"
                                            >
                                                <FileSignature className="h-3.5 w-3.5" />
                                                Koreksi
                                            </Link>
                                        </div>

                                        <div className="mt-2.5 flex items-center justify-between gap-2 border-b border-border/40 pb-2.5">
                                            <div className="flex min-w-0 items-center gap-1.5">
                                                {getStatusLabel(submission.status, submission.is_late, true)}
                                                <span className="inline-flex min-w-0 items-center gap-1 rounded-full bg-primary-500/10 px-2 py-1 text-[10px] font-semibold text-primary-300 ring-1 ring-inset ring-primary-500/20">
                                                    <BookOpen className="h-3 w-3 shrink-0" />
                                                    <span className="truncate">{submission.assignment.material.subject?.name ?? 'Mapel belum diisi'}</span>
                                                </span>
                                            </div>
                                            <span className="inline-flex shrink-0 items-center gap-1 text-[10px] font-medium text-text-muted">
                                                <Clock className="h-3 w-3" />
                                                {formatDate(submission.submitted_at)}
                                            </span>
                                        </div>

                                        <div className="mt-2.5 min-w-0">
                                            <p className="line-clamp-2 text-[13px] font-semibold leading-snug text-primary-300">
                                                {submission.assignment.title}
                                            </p>
                                            <p className="mt-0.5 line-clamp-1 text-[11px] leading-snug text-text-muted">
                                                {submission.assignment.material.title}
                                            </p>
                                        </div>
                                    </article>
                                ))
                            ) : (
                                <div className="glass rounded-2xl p-8 text-center text-text-muted">
                                    <div className="flex flex-col items-center">
                                        <CheckSquare className="mb-3 h-9 w-9 opacity-30" />
                                        <p className="text-sm font-semibold text-text-light">Hore! Semua tugas sudah dinilai</p>
                                        <p className="mt-1 text-xs leading-relaxed">{selectedPendingSubject ? 'Tidak ada tugas yang perlu dikoreksi untuk mata pelajaran ini.' : 'Tidak ada tugas siswa yang mengantre untuk dikoreksi.'}</p>
                                    </div>
                                </div>
                            )}
                        </div>

                        {/* Desktop table */}
                        <div className="glass hidden overflow-hidden rounded-2xl md:block">
                            <div className="overflow-x-auto">
                                <table className="w-full border-collapse text-left text-sm text-text">
                                    <thead>
                                        <tr className="border-b border-border bg-surface/50 text-xs font-semibold uppercase tracking-wider text-text-muted">
                                            <th className="px-6 py-4">Siswa & Kelas</th>
                                            <th className="px-6 py-4">Tugas</th>
                                            <th className="px-6 py-4">Waktu Kumpul</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">
                                        {submissions.length > 0 ? (
                                            submissions.map((submission) => (
                                                <tr key={submission.id} className="hover:bg-surface-hover/30 transition-colors">
                                                    <td className="px-6 py-4">
                                                        <div className="flex flex-col">
                                                            <span className="font-semibold text-text-light">{submission.student.full_name}</span>
                                                            <span className="text-xs text-text-muted">Kelas {submission.class_name}</span>
                                                        </div>
                                                    </td>
                                                    <td className="px-6 py-4">
                                                        <div className="flex flex-col">
                                                            <span className="text-primary-300 font-medium">
                                                                {submission.assignment.title}
                                                            </span>
                                                            <span className="text-xs text-text-muted">
                                                                {submission.assignment.material.title}
                                                            </span>
                                                        </div>
                                                    </td>
                                                    <td className="px-6 py-4">
                                                        <div className="flex items-center gap-1.5 text-xs text-text-muted">
                                                            <Clock className="h-3.5 w-3.5" />
                                                            <span>{formatDate(submission.submitted_at)}</span>
                                                        </div>
                                                    </td>
                                                    <td className="px-6 py-4">
                                                        {getStatusLabel(submission.status, submission.is_late)}
                                                    </td>
                                                    <td className="px-6 py-4 text-right">
                                                        <Link
                                                            href={`/assignments/${submission.assignment_id}/review?student_id=${submission.student_id}`}
                                                            className="inline-flex items-center gap-2 rounded-lg bg-primary-500 px-3 py-1.5 text-sm font-semibold text-white hover:bg-primary-400 transition-colors"
                                                        >
                                                            <FileSignature className="h-4 w-4" />
                                                            Koreksi
                                                        </Link>
                                                    </td>
                                                </tr>
                                            ))
                                        ) : (
                                            <tr>
                                                <td colSpan={5} className="px-6 py-12 text-center text-text-muted">
                                                    <div className="flex flex-col items-center">
                                                        <CheckSquare className="h-10 w-10 opacity-30 mb-3" />
                                                        <p className="font-medium text-base">Hore! Semua tugas sudah dinilai</p>
                                                        <p className="text-xs mt-1">{selectedPendingSubject ? 'Tidak ada tugas yang perlu dikoreksi untuk mata pelajaran ini.' : 'Tidak ada tugas siswa yang mengantre untuk dikoreksi.'}</p>
                                                    </div>
                                                </td>
                                            </tr>
                                        )}
                                    </tbody>
                                </table>
                            </div>
                        </div>
                    </div>
                ) : (
                    <div className="space-y-4">
                        {/* Period Selector Toolbar */}
                        <div className="glass rounded-2xl p-3.5 sm:p-4">
                            <PeriodSelector
                                selectedYearId={selectedPeriod}
                                baseUrl="/grades"
                                extraParams={{ class_id: selectedClass, subject_id: selectedSubject, pending_subject_id: selectedPendingSubject ?? '' }}
                            />
                        </div>

                        {/* Filters Card */}
                        <form onSubmit={handleFilter} className="glass rounded-2xl p-4 sm:p-5">
                            <div className="mb-3 flex items-center justify-between gap-2">
                                <div className="flex items-center gap-2 text-xs sm:text-sm font-bold text-text">
                                    <Filter className="h-4 w-4 text-primary-400" />
                                    Filter Penilaian
                                </div>
                                {recapData && selectedClass && selectedSubject && (
                                    <a
                                        href={`/grades/export?class_id=${selectedClass}&subject_id=${selectedSubject}&academic_year_id=${selectedPeriod || ''}`}
                                        target="_blank"
                                        rel="noopener noreferrer"
                                        className="inline-flex items-center gap-1.5 rounded-xl border border-emerald-500/30 bg-emerald-500/10 px-3 py-1.5 text-xs font-bold text-emerald-300 hover:bg-emerald-500/20 transition-all"
                                    >
                                        <Download className="h-3.5 w-3.5" /> Ekspor Excel
                                    </a>
                                )}
                            </div>
                            <div className="grid grid-cols-2 gap-2 sm:grid-cols-2 lg:grid-cols-3">
                                <div>
                                    <label className="flex items-center gap-1 text-[10px] sm:text-xs font-semibold text-text-muted mb-1">
                                        <School className="h-3 w-3 text-primary-300" /> Pilih Kelas
                                    </label>
                                    <select
                                        value={selectedClass}
                                        onChange={(e) => setSelectedClass(e.target.value)}
                                        className="w-full rounded-xl border border-border bg-surface px-2.5 py-1.5 text-xs sm:px-3 sm:py-2 sm:text-sm text-text focus:outline-none focus:ring-1 focus:ring-primary-500 truncate"
                                        required
                                    >
                                        <option value="">-- Pilih Kelas --</option>
                                        {classes.map(c => (
                                            <option key={c.id} value={c.id}>{c.name}</option>
                                        ))}
                                    </select>
                                </div>

                                <div>
                                    <label className="flex items-center gap-1 text-[10px] sm:text-xs font-semibold text-text-muted mb-1">
                                        <BookOpen className="h-3 w-3 text-primary-300" /> Pilih Mapel
                                    </label>
                                    <select
                                        value={selectedSubject}
                                        onChange={(e) => setSelectedSubject(e.target.value)}
                                        className="w-full rounded-xl border border-border bg-surface px-2.5 py-1.5 text-xs sm:px-3 sm:py-2 sm:text-sm text-text focus:outline-none focus:ring-1 focus:ring-primary-500 truncate"
                                        required
                                    >
                                        <option value="">-- Pilih Mapel --</option>
                                        {subjects.map(s => (
                                            <option key={s.id} value={s.id}>{s.name}</option>
                                        ))}
                                    </select>
                                </div>

                                <div className="col-span-2 lg:col-span-1 flex items-end">
                                    <button
                                        type="submit"
                                        className="w-full inline-flex min-h-9 sm:min-h-10 items-center justify-center gap-2 rounded-xl bg-primary-500 px-4 py-1.5 text-xs sm:text-sm font-bold text-white hover:bg-primary-600 transition-colors shadow-sm"
                                    >
                                        <Search className="h-4 w-4" /> Tampilkan
                                    </button>
                                </div>
                            </div>
                        </form>

                        {/* Gradebook Matrix Table */}
                        {recapData ? (
                            <div className="glass overflow-hidden rounded-2xl">
                                <div className="overflow-x-auto">
                                    <table className="w-full border-collapse text-left text-sm text-text">
                                        <thead>
                                            <tr className="border-b border-border bg-surface/50 text-xs font-semibold uppercase tracking-wider text-text-muted">
                                                <th className="px-6 py-4 w-12 text-center">No</th>
                                                <th className="px-6 py-4 w-28">NISN</th>
                                                <th className="px-6 py-4 w-64">Nama Lengkap</th>
                                                <th className="px-6 py-4 w-16 text-center">L/P</th>
                                                {recapData.assignments.map((assignment) => (
                                                    <th key={assignment.id} className="px-6 py-4 min-w-[120px] text-center">
                                                        <span className="block truncate max-w-[150px]" title={assignment.title}>
                                                            {assignment.title}
                                                        </span>
                                                        <span className="block text-[10px] text-text-muted font-normal">
                                                            Max {assignment.max_points}
                                                        </span>
                                                    </th>
                                                ))}
                                                <th className="px-6 py-4 w-28 text-center font-bold text-primary-300">Rata-rata</th>
                                            </tr>
                                        </thead>
                                        <tbody className="divide-y divide-border/40">
                                            {recapData.students.length > 0 ? (
                                                recapData.students.map((student, idx) => (
                                                    <tr key={student.id} className="hover:bg-surface-hover/30 transition-colors">
                                                        <td className="px-6 py-3.5 text-center text-text-muted">{idx + 1}</td>
                                                        <td className="px-6 py-3.5 text-text-muted font-mono">{student.nisn}</td>
                                                        <td className="px-6 py-3.5 font-medium text-text-light">{student.full_name}</td>
                                                        <td className="px-6 py-3.5 text-center text-text-muted">{student.gender}</td>
                                                        {recapData.assignments.map((assignment) => (
                                                            <td key={assignment.id} className="px-6 py-3.5 text-center font-medium">
                                                                {getGradeCell(student.id, assignment.id)}
                                                            </td>
                                                        ))}
                                                        <td className="px-6 py-3.5 text-center font-bold text-primary-300 bg-primary-500/5">
                                                            {getStudentAverage(student.id)}
                                                        </td>
                                                    </tr>
                                                ))
                                            ) : (
                                                <tr>
                                                    <td colSpan={5 + recapData.assignments.length} className="px-6 py-12 text-center text-text-muted">
                                                        Tidak ada siswa terdaftar di kelas ini.
                                                    </td>
                                                </tr>
                                            )}
                                        </tbody>
                                    </table>
                                </div>
                            </div>
                        ) : (
                            <div className="glass rounded-2xl p-12 text-center text-text-muted flex flex-col items-center">
                                <AlertCircle className="h-10 w-10 opacity-30 mb-3" />
                                <p className="font-medium text-base">Silakan pilih kelas dan mata pelajaran terlebih dahulu</p>
                                <p className="text-xs mt-1">Gunakan panel penyaring di atas untuk melihat rekapitulasi nilai siswa.</p>
                            </div>
                        )}
                    </div>
                )}
            </div>
        </>
    );
}

GradeIndex.layout = (page: any) => <AuthenticatedLayout title="Penilaian & Koreksi">{page}</AuthenticatedLayout>;
