import { Link, Head } from '@inertiajs/react';
import { BookOpen, Calendar, ArrowRight, CheckCircle, Clock, LockKeyhole } from 'lucide-react';
import StudentLayout from '@/layouts/StudentLayout';
import WhatsAppShareButton from '@/components/WhatsAppShareButton';
import LearningContentFilters from '@/components/LearningContentFilters';
import type { PageProps } from '@/types';

interface Material {
    id: number;
    title: string;
    published_at: string;
    subject: { id: number; name: string } | null;
    teacher: { id: number; name: string } | null;
    assignments: Array<{ id: number; title: string; submission_type: 'text' | 'file' | 'link' | 'physical' | 'quiz'; access?: { status: 'open' | 'locked' | 'closed' } }>;
}

interface Submission {
    id: number;
    assignment_id: number;
    status: 'pending' | 'graded' | 'late' | 'physical_submitted';
    grade: number | null;
}

interface Props extends PageProps {
    materials: Material[];
    submissions: Record<number, Submission>; // Keyed by assignment_id
    subjects: Array<{ id: number; name: string }>;
    selectedSubject: number | null;
    selectedPeriod: number | null;
}

export default function MaterialsList({ materials, submissions, subjects, selectedSubject, selectedPeriod }: Props) {
    function getAssignmentsStatus(material: Material) {
        if (material.assignments.length === 0) {
            return (
                <span className="text-xs text-text-muted italic">Tidak ada tugas</span>
            );
        }

        const total = material.assignments.length;
        let submitted = 0;
        let graded = 0;
        let locked = 0;
        let physicalInClass = 0;

        material.assignments.forEach(assignment => {
            const sub = submissions[assignment.id];
            if (sub) {
                submitted++;
                if (sub.status === 'graded') {
                    graded++;
                }
            } else if (assignment.access && assignment.access.status !== 'open') {
                locked++;
            } else if (assignment.submission_type === 'physical') {
                physicalInClass++;
            }
        });

        if (submitted === total) {
            return (
                <span className="inline-flex items-center gap-1 text-xs font-semibold text-emerald-400">
                    <CheckCircle className="h-3.5 w-3.5" /> Tugas Selesai ({graded}/{total} dinilai)
                </span>
            );
        }

        if (locked > 0 && submitted + locked === total) {
            return <span className="inline-flex items-center gap-1 text-xs font-semibold text-amber-300"><LockKeyhole className="h-3.5 w-3.5" /> {locked} Tugas menunggu jadwal</span>;
        }

        if (physicalInClass > 0 && submitted + locked + physicalInClass === total) {
            return (
                <span className="inline-flex items-center gap-1 text-xs font-semibold text-blue-300">
                    <BookOpen className="h-3.5 w-3.5" /> {physicalInClass} Tugas fisik di kelas{locked > 0 ? ` · ${locked} dikunci` : ''}
                </span>
            );
        }

        const pendingOnline = total - submitted - locked - physicalInClass;

        return (
            <span className="inline-flex items-center gap-1 text-xs font-semibold text-amber-400">
                <Clock className="h-3.5 w-3.5" /> {pendingOnline} Tugas online menanti{physicalInClass > 0 ? ` · ${physicalInClass} fisik di kelas` : ''}{locked > 0 ? ` · ${locked} dikunci` : ''}
            </span>
        );
    }

    return (
        <>
            <Head title="Materi Pembelajaran" />

            <div className="space-y-6">
                <div className="flex items-center justify-between">
                    <div>
                        <h2 className="text-lg font-bold text-text-light">Materi Pelajaran</h2>
                        <p className="text-sm text-text-muted">Daftar materi yang dirilis untuk kelas Anda</p>
                    </div>
                </div>

                <LearningContentFilters baseUrl="/materials" subjects={subjects} selectedSubject={selectedSubject} selectedPeriod={selectedPeriod} showPeriod={false} />
                <p className="text-xs text-text-muted" role="status">{materials.length} materi ditampilkan</p>

                {materials.length > 0 ? (
                    <div className="grid gap-4 sm:grid-cols-2 lg:grid-cols-3">
                        {materials.map((material) => (
                            <div 
                                key={material.id} 
                                className="glass group flex flex-col justify-between rounded-2xl p-5 hover:scale-[1.01] transition-all border border-border/40"
                            >
                                <div className="space-y-4">
                                    {/* Icon & Subject */}
                                    <div className="flex items-center justify-between">
                                        <div className="flex h-10 w-10 items-center justify-center rounded-xl bg-primary-500/10 text-primary-400">
                                            <BookOpen className="h-5 w-5" />
                                        </div>
                                        <span className="inline-flex items-center rounded-md bg-primary-500/10 px-2.5 py-0.5 text-xs font-medium text-primary-300 ring-1 ring-inset ring-primary-500/20">
                                            {material.subject?.name ?? 'Mata Pelajaran'}
                                        </span>
                                    </div>

                                    {/* Title & Info */}
                                    <div>
                                        <h3 className="font-bold text-text-light group-hover:text-primary-300 transition-colors line-clamp-2">
                                            {material.title}
                                        </h3>
                                        <p className="text-xs text-text-muted mt-1.5">
                                            Oleh: {material.teacher?.name ?? '-'}
                                        </p>
                                    </div>
                                </div>

                                {/* Bottom Info */}
                                <div className="mt-5 flex flex-wrap items-center justify-between gap-3 border-t border-border/30 pt-4">
                                    <div className="min-w-0 space-y-1">
                                        <p className="text-[10px] text-text-muted flex items-center gap-1">
                                            <Calendar className="h-3 w-3" /> {material.published_at ? new Date(material.published_at).toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric' }) : '-'}
                                        </p>
                                        {getAssignmentsStatus(material)}
                                    </div>

                                    <div className="flex shrink-0 items-center gap-2">
                                        <WhatsAppShareButton path={`/materials/${material.id}`} title={material.title} kind="materi" />
                                        <Link
                                            href={`/materials/${material.id}`}
                                            className="flex h-10 w-10 items-center justify-center rounded-xl bg-surface text-text-muted transition-colors hover:bg-primary-500 hover:text-white"
                                            title="Buka Materi"
                                            aria-label={`Buka materi ${material.title}`}
                                        >
                                            <ArrowRight className="h-4 w-4" />
                                        </Link>
                                    </div>
                                </div>
                            </div>
                        ))}
                    </div>
                ) : (
                    <div className="glass rounded-2xl p-12 text-center text-text-muted py-20">
                        <BookOpen className="mb-3 h-12 w-12 opacity-30 mx-auto" />
                        <h4 className="font-semibold text-lg text-text-light">{selectedSubject ? 'Tidak Ada Materi yang Sesuai' : 'Belum Ada Materi'}</h4>
                        <p className="text-sm mt-1">{selectedSubject ? 'Tidak ada materi untuk mata pelajaran ini. Pilih mapel lain atau Semua Mata Pelajaran.' : 'Guru belum merilis materi pelajaran apa pun untuk kelas Anda saat ini.'}</p>
                    </div>
                )}
            </div>
        </>
    );
}

MaterialsList.layout = (page: any) => <StudentLayout title="Materi Pembelajaran">{page}</StudentLayout>;
