import { useState } from 'react';
import { Head, Link, router } from '@inertiajs/react';
import { Award, CalendarDays, ChevronDown, Download, Eye, Sparkles, Trophy, UsersRound } from 'lucide-react';
import StudentLayout from '@/layouts/StudentLayout';

type RecognitionType = 'appreciation' | 'achievement';
type Tab = 'class' | 'mine';

interface MineRecognition {
    id: number;
    type: RecognitionType;
    title: string;
    category: string;
    recognized_on: string;
    description: string;
    level: string | null;
    result: string | null;
    organizer: string | null;
    audience: 'student' | 'class';
    xp_award: { amount: number; status: 'awarded' | 'weekly_cap' | 'reversed' } | null;
    synced_class: { id: number; name: string };
    academic_year: { id: number; name: string };
}

interface ClassPublication {
    uuid: string;
    type: RecognitionType;
    title: string;
    category: string;
    recognized_on: string;
    public_summary: string;
    level: string | null;
    result: string | null;
    organizer: string | null;
    published_at: string;
    issuer_name: string;
    recipients: Array<{ display_name: string }>;
    recipient_count: number;
    is_mine: boolean;
}

interface Pagination<T> {
    data: T[];
    links: Array<{ url: string | null; label: string; active: boolean }>;
    total: number;
}

interface Props {
    student: { id: number; full_name: string; nisn: string };
    recognitions: Pagination<MineRecognition>;
    classFeed: Pagination<ClassPublication>;
    activeTab: Tab;
    classContext: {
        class: { id: number; name: string } | null;
        academic_year: { id: number; name: string } | null;
        semester: { id: number; type: string } | null;
    } | null;
    availableEnrollments: Array<{
        academic_year_id: number;
        class_name: string;
        academic_year_name: string;
        semester_id: number | null;
        semester_type: string | null;
    }>;
    filters: { type: string; category: string; academic_year_id: number | null; semester_id: number | null };
    summary: { appreciations: number; achievements: number };
    classSummary: { total: number; appreciations: number; achievements: number };
}

const categoryLabels: Record<string, string> = {
    character: 'Karakter', positive_discipline: 'Disiplin positif', leadership: 'Kepemimpinan', social_care: 'Kepedulian sosial', learning_progress: 'Perkembangan belajar', creativity: 'Kreativitas', responsibility: 'Tanggung jawab', academic: 'Akademik', sports: 'Olahraga', arts_culture: 'Seni & budaya', religious: 'Keagamaan', technology: 'Teknologi', social_environment: 'Sosial & lingkungan', other: 'Lainnya',
};
const levelLabels: Record<string, string> = { class: 'Kelas', school: 'Sekolah', subdistrict: 'Kecamatan', district_city: 'Kabupaten/kota', province: 'Provinsi', national: 'Nasional', international: 'Internasional' };

export default function StudentRecognitionIndex({ student, recognitions, classFeed, activeTab, classContext, availableEnrollments, filters, summary, classSummary }: Props) {
    const [expanded, setExpanded] = useState<string | number | null>(null);
    const navigate = (changes: Record<string, string | number | null>) => {
        router.get('/student/recognitions', {
            tab: activeTab,
            type: filters.type,
            category: filters.category,
            academic_year_id: filters.academic_year_id,
            semester_id: filters.semester_id,
            ...changes,
        }, { preserveState: true, preserveScroll: true, replace: true });
    };
    const changeEnrollment = (academicYearId: string) => {
        const enrollment = availableEnrollments.find((item) => item.academic_year_id === Number(academicYearId));
        navigate({ academic_year_id: Number(academicYearId), semester_id: enrollment?.semester_id ?? null });
    };

    return (
        <>
            <Head title="Penghargaan" />
            <div className="mx-auto max-w-5xl space-y-4">
                <section className="rounded-2xl border border-primary-500/20 bg-linear-to-r from-violet-500/10 via-surface/80 to-amber-500/10 p-4 sm:p-5">
                    <div className="flex items-center gap-3">
                        <span className="rounded-xl bg-primary-500/15 p-2.5 text-primary-300"><Sparkles className="h-5 w-5" /></span>
                        <div className="min-w-0 flex-1">
                            <p className="text-[10px] font-black uppercase tracking-[0.16em] text-primary-300">Ruang bertumbuh</p>
                            <h1 className="mt-0.5 truncate text-lg font-black text-text sm:text-xl">Halo, {student.full_name}</h1>
                            <p className="mt-1 text-xs text-text-muted">Kebaikan dan pencapaian layak mendapat pengakuan.</p>
                        </div>
                    </div>
                    <div className="mt-4 grid grid-cols-2 rounded-xl bg-surface/60 p-1">
                        <TabButton active={activeTab === 'class'} onClick={() => navigate({ tab: 'class' })} icon={<UsersRound className="h-4 w-4" />} label="Papan Kelas" />
                        <TabButton active={activeTab === 'mine'} onClick={() => navigate({ tab: 'mine' })} icon={<Award className="h-4 w-4" />} label="Pencapaian Saya" />
                    </div>
                </section>

                {activeTab === 'class' ? (
                    <>
                        <section className="glass rounded-2xl p-3.5 sm:p-4">
                            <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                                <div>
                                    <p className="font-black text-text">{classContext?.class?.name ?? 'Kelas belum tersedia'}</p>
                                    <p className="text-xs text-text-muted">{classContext?.academic_year?.name ?? 'Belum ada enrollment'}{classContext?.semester?.type ? ` · Semester ${classContext.semester.type}` : ''}</p>
                                </div>
                                {availableEnrollments.length > 1 && <select value={filters.academic_year_id ?? ''} onChange={(event) => changeEnrollment(event.target.value)} className="form-input min-w-0 rounded-xl text-xs sm:w-52" aria-label="Pilih riwayat kelas">{availableEnrollments.map((item) => <option key={item.academic_year_id} value={item.academic_year_id}>{item.class_name} · {item.academic_year_name}</option>)}</select>}
                            </div>
                            <div className="mt-3 flex flex-wrap gap-2 text-[11px] font-bold"><StatChip label="Momen" value={classSummary.total} color="text-primary-300" /><StatChip label="Apresiasi" value={classSummary.appreciations} color="text-violet-300" /><StatChip label="Prestasi" value={classSummary.achievements} color="text-amber-300" /></div>
                            <div className="mt-3 flex gap-2 overflow-x-auto pb-1">
                                <FilterButton active={!filters.type} onClick={() => navigate({ type: '', category: '' })} label="Semua" />
                                <FilterButton active={filters.type === 'appreciation'} onClick={() => navigate({ type: 'appreciation', category: '' })} label="Apresiasi" />
                                <FilterButton active={filters.type === 'achievement'} onClick={() => navigate({ type: 'achievement', category: '' })} label="Prestasi" />
                            </div>
                        </section>

                        {classFeed.data.length === 0 ? (
                            <EmptyState icon={<UsersRound className="h-8 w-8" />} title="Belum ada momen yang dibagikan" description="Penghargaan pribadi dan catatan internal tidak ditampilkan di Papan Kelas." />
                        ) : (
                            <section className="space-y-2.5">
                                {classFeed.data.map((publication) => {
                                    const isExpanded = expanded === publication.uuid;
                                    const shownNames = publication.recipients.slice(0, 3).map((item) => item.display_name).join(', ');
                                    return (
                                        <article key={publication.uuid} className={`rounded-2xl border bg-surface/70 p-3.5 transition-colors ${publication.is_mine ? 'border-primary-500/30' : 'border-border'}`}>
                                            <button type="button" aria-expanded={isExpanded} onClick={() => setExpanded(isExpanded ? null : publication.uuid)} className="w-full text-left">
                                                <div className="flex items-start gap-3">
                                                    <RecognitionIcon type={publication.type} />
                                                    <div className="min-w-0 flex-1">
                                                        <div className="flex flex-wrap items-center gap-1.5"><span className="text-[10px] font-black uppercase tracking-wider text-text-muted">{publication.type === 'achievement' ? 'Prestasi' : 'Apresiasi'}</span>{publication.is_mine && <span className="rounded-md bg-primary-500/10 px-1.5 py-0.5 text-[9px] font-bold text-primary-300">Kamu ikut di sini</span>}</div>
                                                        <h2 className="mt-0.5 text-sm font-black leading-5 text-text sm:text-base">{publication.title}</h2>
                                                        <p className="mt-1 truncate text-xs font-bold text-primary-300">{shownNames}{publication.recipient_count > 3 ? ` +${publication.recipient_count - 3} siswa` : ''}</p>
                                                    </div>
                                                    <ChevronDown className={`mt-1 h-4 w-4 shrink-0 text-text-muted transition-transform ${isExpanded ? 'rotate-180' : ''}`} />
                                                </div>
                                                <p className={`${isExpanded ? '' : 'line-clamp-2'} mt-2 text-xs leading-5 text-text-muted sm:text-sm`}>{publication.public_summary}</p>
                                            </button>
                                            <div className="mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border pt-2.5 text-[10px] text-text-muted"><span className="rounded-md bg-surface-hover px-1.5 py-1">{categoryLabels[publication.category]}</span>{publication.level && <span className="rounded-md bg-surface-hover px-1.5 py-1">{levelLabels[publication.level]}</span>}{publication.result && <span className="rounded-md bg-emerald-500/10 px-1.5 py-1 font-bold text-emerald-300">{publication.result}</span>}<span className="ml-auto inline-flex items-center gap-1"><CalendarDays className="h-3 w-3" />{formatDate(publication.recognized_on)}</span></div>
                                            {isExpanded && <div className="mt-3 rounded-xl bg-surface-hover/60 p-3 text-xs text-text-muted"><p><span className="font-bold text-text">Penerima:</span> {publication.recipients.map((item) => item.display_name).join(', ')}</p>{publication.organizer && <p className="mt-1"><span className="font-bold text-text">Penyelenggara:</span> {publication.organizer}</p>}<p className="mt-1"><span className="font-bold text-text">Pengakuan:</span> {publication.issuer_name}</p></div>}
                                        </article>
                                    );
                                })}
                            </section>
                        )}
                        <Pagination links={classFeed.links} />
                    </>
                ) : (
                    <>
                        <section className="glass flex flex-col gap-3 rounded-2xl p-3.5 sm:flex-row sm:items-center sm:justify-between sm:p-4">
                            <div><p className="font-black text-text">Portofolio pribadimu</p><p className="mt-0.5 text-xs text-text-muted">Hanya penghargaan yang dipublikasikan kepadamu.</p><div className="mt-2 flex gap-2 text-[11px] font-bold"><StatChip label="Apresiasi" value={summary.appreciations} color="text-violet-300" /><StatChip label="Prestasi" value={summary.achievements} color="text-amber-300" /></div></div>
                            <a href="/student/recognitions/export/docx" className="inline-flex min-h-10 items-center justify-center gap-2 rounded-xl border border-primary-500/30 bg-primary-500/10 px-3 text-xs font-bold text-primary-200"><Download className="h-4 w-4" /> Unduh DOCX</a>
                        </section>

                        {recognitions.data.length === 0 ? (
                            <EmptyState icon={<Award className="h-8 w-8" />} title="Belum ada penghargaan yang dipublikasikan" description="Catatan internal wali kelas tidak ditampilkan di halaman ini." />
                        ) : (
                            <section className="space-y-2.5">
                                {recognitions.data.map((recognition) => {
                                    const isExpanded = expanded === recognition.id;
                                    return (
                                        <article key={recognition.id} className="rounded-2xl border border-border bg-surface/70 p-3.5">
                                            <button type="button" aria-expanded={isExpanded} onClick={() => setExpanded(isExpanded ? null : recognition.id)} className="w-full text-left">
                                                <div className="flex items-start gap-3"><RecognitionIcon type={recognition.type} /><div className="min-w-0 flex-1"><div className="flex flex-wrap items-center gap-1.5"><span className="text-[10px] font-black uppercase tracking-wider text-text-muted">{recognition.type === 'achievement' ? 'Prestasi' : 'Apresiasi'}</span><span className={`rounded-md px-1.5 py-0.5 text-[9px] font-bold ${recognition.audience === 'class' ? 'bg-sky-500/10 text-sky-300' : 'bg-emerald-500/10 text-emerald-300'}`}>{recognition.audience === 'class' ? 'Papan Kelas' : 'Pribadi'}</span></div><h2 className="mt-0.5 text-sm font-black leading-5 text-text sm:text-base">{recognition.title}</h2></div><ChevronDown className={`mt-1 h-4 w-4 shrink-0 text-text-muted transition-transform ${isExpanded ? 'rotate-180' : ''}`} /></div>
                                                <p className={`${isExpanded ? '' : 'line-clamp-2'} mt-2 text-xs leading-5 text-text-muted sm:text-sm`}>{recognition.description}</p>
                                            </button>
                                            <div className="mt-2.5 flex flex-wrap items-center gap-1.5 border-t border-border pt-2.5 text-[10px] text-text-muted"><span className="rounded-md bg-surface-hover px-1.5 py-1">{categoryLabels[recognition.category]}</span>{recognition.level && <span className="rounded-md bg-surface-hover px-1.5 py-1">{levelLabels[recognition.level]}</span>}{recognition.result && <span className="rounded-md bg-emerald-500/10 px-1.5 py-1 font-bold text-emerald-300">{recognition.result}</span>}{recognition.xp_award && <span className={`rounded-md px-1.5 py-1 font-bold ${recognition.xp_award.amount > 0 ? 'bg-primary-500/10 text-primary-300' : 'bg-surface-hover text-text-muted'}`}>{recognition.xp_award.amount > 0 ? `+${recognition.xp_award.amount} XP` : 'Batas XP mingguan'}</span>}<span className="ml-auto inline-flex items-center gap-1"><CalendarDays className="h-3 w-3" />{formatDate(recognition.recognized_on)}</span></div>
                                            {isExpanded && <div className="mt-3 flex items-center gap-1.5 text-[10px] text-emerald-300"><Eye className="h-3.5 w-3.5" /> Dipublikasikan untukmu · {recognition.academic_year.name}</div>}
                                        </article>
                                    );
                                })}
                            </section>
                        )}
                        <Pagination links={recognitions.links} />
                    </>
                )}
            </div>
        </>
    );
}

function TabButton({ active, onClick, icon, label }: { active: boolean; onClick: () => void; icon: React.ReactNode; label: string }) { return <button type="button" aria-pressed={active} onClick={onClick} className={`inline-flex min-h-10 items-center justify-center gap-2 rounded-lg text-xs font-black transition-colors ${active ? 'bg-primary-500 text-white shadow-sm' : 'text-text-muted hover:bg-surface-hover'}`}>{icon}{label}</button>; }
function FilterButton({ active, onClick, label }: { active: boolean; onClick: () => void; label: string }) { return <button type="button" aria-pressed={active} onClick={onClick} className={`shrink-0 rounded-lg border px-3 py-1.5 text-[11px] font-bold ${active ? 'border-primary-500 bg-primary-500/15 text-primary-300' : 'border-border text-text-muted'}`}>{label}</button>; }
function StatChip({ label, value, color }: { label: string; value: number; color: string }) { return <span className="rounded-lg bg-surface-hover px-2 py-1"><strong className={color}>{value}</strong> {label}</span>; }
function RecognitionIcon({ type }: { type: RecognitionType }) { return <span className={`shrink-0 rounded-xl p-2 ${type === 'achievement' ? 'bg-amber-500/10 text-amber-300' : 'bg-violet-500/10 text-violet-300'}`}>{type === 'achievement' ? <Trophy className="h-5 w-5" /> : <Award className="h-5 w-5" />}</span>; }
function EmptyState({ icon, title, description }: { icon: React.ReactNode; title: string; description: string }) { return <section className="rounded-2xl border border-dashed border-border bg-surface/50 p-8 text-center"><span className="mx-auto inline-flex text-text-muted">{icon}</span><h2 className="mt-3 text-sm font-black text-text">{title}</h2><p className="mt-1 text-xs leading-5 text-text-muted">{description}</p></section>; }
function Pagination({ links }: { links: Array<{ url: string | null; label: string; active: boolean }> }) { return links.length > 3 ? <nav className="flex flex-wrap justify-center gap-1">{links.map((link, index) => link.url ? <Link key={index} href={link.url} preserveScroll className={`rounded-lg border px-3 py-2 text-xs ${link.active ? 'border-primary-500 bg-primary-500 text-white' : 'border-border text-text-muted'}`} dangerouslySetInnerHTML={{ __html: link.label }} /> : null)}</nav> : null; }
function formatDate(value: string): string { return new Date(`${value.slice(0, 10)}T00:00:00`).toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric' }); }

StudentRecognitionIndex.layout = (page: React.ReactNode) => <StudentLayout title="Penghargaan">{page}</StudentLayout>;
