import { Head, Link, router } from '@inertiajs/react';
import { AlertCircle, Calendar, CalendarClock, Edit3, Eye, LockKeyhole, LockOpen, Plus, Trash2 } from 'lucide-react';
import { useState } from 'react';
import AuthenticatedLayout from '@/layouts/AuthenticatedLayout';
import ConfirmDeleteModal from '@/components/ConfirmDeleteModal';
import MaterialMediaRenderer, { type MaterialMediaResource } from '@/components/MaterialMediaRenderer';
import RichTextContent from '@/components/RichTextContent';
import WhatsAppShareButton from '@/components/WhatsAppShareButton';
import { formatDate } from '@/lib/utils';
import type { PageProps } from '@/types';

interface Assignment {
    id: number;
    title: string;
    description: string | null;
    assignment_type: 'standard' | 'quiz' | 'worksheet';
    submission_type: string;
    due_date: string;
    max_points: number;
    release_mode: 'meeting' | 'schedule' | 'manual_only' | 'manual' | 'immediate';
    classes?: Array<{ id: number; name: string }>;
    availabilities?: Array<{
        synced_class_id: number;
        opens_at: string | null;
        due_at: string | null;
        manually_opened_at: string | null;
        source: string;
        access?: { status: 'open' | 'locked' | 'closed'; message: string; opens_at: string | null; due_at: string | null };
        synced_class?: { id: number; name: string };
    }>;
}

interface Material {
    id: number;
    title: string;
    class_id?: number | null;
    content: string | null;
    status: 'draft' | 'published';
    classes?: Array<{ id: number; name: string }>;
    synced_class?: { id: number; name: string } | null;
    subject?: { id: number; name: string } | null;
    links: MaterialMediaResource[];
    assignments: Assignment[];
}

interface Props extends PageProps { material: Material }

export default function MateriShow({ material }: Props) {
    const [deletingAssignment, setDeletingAssignment] = useState<Assignment | null>(null);
    const [processingAvailability, setProcessingAvailability] = useState<string | null>(null);
    const classNames = material.classes?.length ? material.classes.map((item) => item.name).join(', ') : material.synced_class?.name || '-';

    return (
        <AuthenticatedLayout title={material.title} backHref="/materials">
            <Head title={material.title} />
            <div className="mx-auto max-w-7xl space-y-6 min-w-0 w-full">
                <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                    <div className="flex flex-wrap gap-2 text-xs text-text-muted min-w-0">
                        <span className="rounded-lg border border-border bg-surface px-3 py-1.5 max-w-full truncate" title={`Kelas ${classNames}`}>Kelas {classNames}</span>
                        <span className="rounded-lg border border-border bg-surface px-3 py-1.5">{material.subject?.name || '-'}</span>
                        <span className={`rounded-lg px-3 py-1.5 font-semibold ${material.status === 'published' ? 'bg-emerald-500/10 text-emerald-400' : 'bg-amber-500/10 text-amber-400'}`}>{material.status === 'published' ? 'Published' : 'Draft'}</span>
                    </div>
                    <div className="flex shrink-0 flex-wrap items-center gap-2">
                        {material.status === 'published' && (
                            <WhatsAppShareButton path={`/materials/${material.id}`} title={material.title} kind="materi" label="Bagikan materi" />
                        )}
                        <Link href={`/materials/${material.id}/edit`} className="inline-flex items-center justify-center gap-2 rounded-xl bg-surface px-4 py-2.5 text-sm font-semibold hover:bg-surface-hover shrink-0"><Edit3 className="h-4 w-4" /> Edit Materi</Link>
                    </div>
                </div>

                <div className="grid gap-6 lg:grid-cols-5 min-w-0">
                    <div className="space-y-6 lg:col-span-3 min-w-0">
                        <section className="glass rounded-2xl p-4 sm:p-6 min-w-0 overflow-hidden">
                            <h2 className="text-xl sm:text-2xl font-bold text-text-light break-words">{material.title}</h2>
                            <RichTextContent
                                html={material.content || '<p>Tidak ada konten teks tambahan.</p>'}
                                className="mt-5 max-w-none text-sm leading-relaxed break-words overflow-hidden"
                            />
                        </section>
                        <section className="glass rounded-2xl p-4 sm:p-6 space-y-4 min-w-0 overflow-hidden">
                            <h3 className="text-lg font-semibold text-text-light">Media Pembelajaran</h3>
                            <MaterialMediaRenderer resources={material.links} />
                        </section>
                    </div>

                    <section className="glass rounded-2xl p-4 sm:p-6 lg:col-span-2 h-fit min-w-0">
                        <div className="mb-5 flex items-center justify-between gap-3">
                            <div>
                                <h3 className="text-lg font-semibold text-text-light">Penugasan</h3>
                                <p className="text-xs text-text-muted">Tugas biasa, quiz, dan LKPD interaktif.</p>
                            </div>
                            <Link href={`/materials/${material.id}/assignments/create`} className="inline-flex items-center gap-1 rounded-lg bg-primary-500 px-3 py-2 text-xs font-bold text-white"><Plus className="h-4 w-4" /> Tambah</Link>
                        </div>
                        {material.assignments.length === 0 ? (
                            <div className="rounded-xl border border-dashed border-border p-8 text-center text-sm text-text-muted">
                                <AlertCircle className="mx-auto mb-2 h-7 w-7 opacity-40" />
                                <p>Belum ada tugas untuk materi ini.</p>
                                <div className="mt-3">
                                    <Link
                                        href={`/materials/${material.id}/assignments/create`}
                                        className="inline-flex items-center gap-1.5 rounded-xl bg-primary-500 px-3.5 py-2 text-xs font-semibold text-white shadow-sm hover:bg-primary-600 transition-colors"
                                    >
                                        <Plus className="h-3.5 w-3.5" /> Tambah Tugas
                                    </Link>
                                </div>
                            </div>
                        ) : (
                            <div className="space-y-3">
                                {material.assignments.map((assignment) => (
                                    <article key={assignment.id} className="rounded-xl border border-border/50 bg-surface/70 p-4">
                                        <div className="flex items-start justify-between gap-3">
                                            <div>
                                                <div className="flex flex-wrap items-center gap-1.5">
                                                    <span className="text-[10px] font-bold uppercase tracking-wider text-primary-400">{assignment.assignment_type === 'worksheet' ? 'Worksheet' : assignment.assignment_type === 'quiz' ? 'Quiz' : 'Tugas Biasa'}</span>
                                                    {(() => {
                                                        const targetClasses = assignment.classes && assignment.classes.length > 0
                                                            ? assignment.classes
                                                            : material.classes?.length
                                                                ? material.classes
                                                                : material.synced_class ? [material.synced_class] : [];
                                                        const isSubset = Boolean(material.classes && material.classes.length > 1 && assignment.classes && assignment.classes.length > 0 && assignment.classes.length < material.classes.length);

                                                        if (isSubset) {
                                                            return (
                                                                <span className="rounded-md border border-amber-500/30 bg-amber-500/10 px-1.5 py-0.5 text-[10px] font-bold text-amber-300">
                                                                    🎯 {targetClasses.map((c) => c.name).join(', ')}
                                                                </span>
                                                            );
                                                        }

                                                        if (material.classes && material.classes.length > 1) {
                                                            return (
                                                                <span className="rounded-md border border-border/60 bg-surface px-1.5 py-0.5 text-[10px] font-medium text-text-muted">
                                                                    Semua Kelas
                                                                </span>
                                                            );
                                                        }

                                                        return null;
                                                    })()}
                                                </div>
                                                <h4 className="mt-1 font-semibold text-text-light">{assignment.title}</h4>
                                                <p className="mt-1 text-[10px] text-text-muted">{assignment.release_mode === 'meeting' ? 'Dibuka saat guru memulai KBM' : assignment.release_mode === 'schedule' || assignment.release_mode === 'manual' ? 'Terbuka otomatis sesuai waktu' : assignment.release_mode === 'manual_only' ? 'Dibuka manual oleh guru' : 'Tugas lama · akses langsung'}</p>
                                            </div>
                                            <span className="rounded-lg bg-surface px-2 py-1 text-xs font-bold text-text-muted">{assignment.max_points} poin</span>
                                        </div>
                                        <div className="mt-3 flex items-center gap-1 text-xs text-text-muted"><Calendar className="h-3.5 w-3.5" /> {formatDate(assignment.due_date)}</div>
                                        {(() => {
                                            const targetClassIds = assignment.classes && assignment.classes.length > 0
                                                ? assignment.classes.map((c) => c.id)
                                                : material.classes && material.classes.length > 0
                                                    ? material.classes.map((c) => c.id)
                                                    : material.class_id ? [material.class_id] : material.synced_class ? [material.synced_class.id] : [];
                                            const visibleAvailabilities = (assignment.availabilities || []).filter((av) =>
                                                targetClassIds.includes(av.synced_class_id)
                                            );
                                            if (visibleAvailabilities.length === 0) return null;
                                            return (
                                                <div className="mt-3 space-y-2 rounded-lg border border-border/40 bg-background/30 p-2.5">
                                                    {visibleAvailabilities.map((availability) => {
                                                        const access = availability.access;
                                                        const opensAt = access?.opens_at || availability.manually_opened_at || availability.opens_at;
                                                        const isOpen = access?.status === 'open';
                                                        const actionKey = `${assignment.id}-${availability.synced_class_id}`;
                                                        return (
                                                            <div key={availability.synced_class_id} className="flex flex-wrap items-center gap-2 text-[11px]">
                                                                {isOpen ? <LockOpen className="h-3.5 w-3.5 shrink-0 text-emerald-400" /> : <LockKeyhole className="h-3.5 w-3.5 shrink-0 text-amber-400" />}
                                                                <div className="min-w-0 flex-1"><p className="font-semibold text-text-light">{availability.synced_class?.name || `Kelas ${availability.synced_class_id}`}</p><p className="truncate text-text-muted">{access?.status === 'closed' ? 'Pengumpulan ditutup' : assignment.release_mode === 'immediate' ? 'Akses langsung · waktu buka lama tidak dicatat' : isOpen ? `Dibuka ${formatDate(availability.manually_opened_at || opensAt!)}` : opensAt ? `Jadwal ${formatDate(opensAt)}` : 'Belum ada jadwal pembukaan'}</p></div>
                                                                {!isOpen && access?.status !== 'closed' && <button type="button" disabled={processingAvailability === actionKey} onClick={() => { setProcessingAvailability(actionKey); router.post(`/assignments/${assignment.id}/availability/open-now`, { class_id: availability.synced_class_id }, { preserveScroll: true, onFinish: () => setProcessingAvailability(null) }); }} className="rounded-md bg-emerald-500/10 px-2 py-1 font-semibold text-emerald-300 disabled:opacity-50">Buka sekarang</button>}
                                                                {!isOpen && access?.status !== 'closed' && ['meeting', 'schedule'].includes(assignment.release_mode) && availability.opens_at && <button type="button" disabled={processingAvailability === actionKey} onClick={() => { setProcessingAvailability(actionKey); router.post(`/assignments/${assignment.id}/availability/postpone`, { class_id: availability.synced_class_id }, { preserveScroll: true, onFinish: () => setProcessingAvailability(null) }); }} className="inline-flex items-center gap-1 rounded-md bg-amber-500/10 px-2 py-1 font-semibold text-amber-300 disabled:opacity-50"><CalendarClock className="h-3 w-3" /> Tunda</button>}
                                                            </div>
                                                        );
                                                    })}
                                                </div>
                                            );
                                        })()}
                                        <div className="mt-4 flex flex-wrap gap-2 border-t border-border/40 pt-3">
                                            {material.status === 'published' && (
                                                <WhatsAppShareButton
                                                    path={`/materials/${material.id}?assignment=${assignment.id}`}
                                                    title={assignment.title}
                                                    kind="tugas"
                                                    className="min-h-8 rounded-lg px-2.5 py-1.5"
                                                />
                                            )}
                                            <Link href={`/assignments/${assignment.id}/review`} className="inline-flex items-center gap-1 rounded-lg bg-primary-500/10 px-2.5 py-1.5 text-xs font-semibold text-primary-300"><Eye className="h-3.5 w-3.5" /> Periksa</Link>
                                            <Link href={`/assignments/${assignment.id}/edit`} className="inline-flex items-center gap-1 rounded-lg bg-surface-hover px-2.5 py-1.5 text-xs font-semibold"><Edit3 className="h-3.5 w-3.5" /> Edit</Link>
                                            <button type="button" onClick={() => setDeletingAssignment(assignment)} className="ml-auto rounded-lg p-1.5 text-text-muted hover:bg-rose-500/10 hover:text-rose-400"><Trash2 className="h-4 w-4" /></button>
                                        </div>
                                    </article>
                                ))}
                            </div>
                        )}
                    </section>
                </div>
            </div>
            <ConfirmDeleteModal isOpen={Boolean(deletingAssignment)} onClose={() => setDeletingAssignment(null)} onConfirm={() => deletingAssignment && router.delete(`/assignments/${deletingAssignment.id}`)} title="Hapus Tugas" message="Semua jawaban siswa untuk tugas ini juga akan terhapus." />
        </AuthenticatedLayout>
    );
}
