import { Head, Link, router } from '@inertiajs/react';
import { ChevronLeft, ChevronRight } from 'lucide-react';
import AppLayout from '@/layouts/app-layout';
import { cn } from '@/lib/utils';
import type { BreadcrumbItem } from '@/types';

type Task = {
    id: number;
    title: string;
    type: 'lesson' | 'quiz' | 'assignment' | 'personal';
    status: 'pending' | 'completed' | 'missed';
    is_priority: boolean;
    scheduled_date: string;
};

type Props = {
    month: string; // 'YYYY-MM'
    tasksByDate: Record<string, Task[]>;
};

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Planner', href: '/planner' },
    { title: 'Kalender', href: '/planner/calendar' },
];

const TYPE_DOT: Record<string, string> = {
    lesson: 'bg-sky-300',
    quiz: 'bg-amber-400',
    assignment: 'bg-violet-400',
    personal: 'bg-slate-400',
    assigned: 'bg-sky-300',
};

const DAY_NAMES = ['Min', 'Sen', 'Sel', 'Rab', 'Kam', 'Jum', 'Sab'];

const MONTH_NAMES = [
    'Januari', 'Februari', 'Maret', 'April', 'Mei', 'Juni',
    'Juli', 'Agustus', 'September', 'Oktober', 'November', 'Desember',
];

function getMonthGrid(year: number, month: number): (number | null)[] {
    const firstDay = new Date(year, month, 1).getDay();
    const daysInMonth = new Date(year, month + 1, 0).getDate();
    const grid: (number | null)[] = Array(firstDay).fill(null);
    for (let d = 1; d <= daysInMonth; d++) {
        grid.push(d);
    }
    while (grid.length % 7 !== 0) {
        grid.push(null);
    }
    return grid;
}

export default function PlannerCalendar({ month, tasksByDate }: Props) {
    const [year, mon] = month.split('-').map(Number);
    const prevMonth = new Date(year, mon - 2, 1);
    const nextMonth = new Date(year, mon, 1);
    const grid = getMonthGrid(year, mon - 1);
    const today = new Date().toISOString().slice(0, 10);

    function nav(d: Date) {
        router.get('/planner/calendar', {
            month: `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}`,
        });
    }

    return (
        <>
            <Head title="Kalender Planner" />

            <div className="min-h-screen bg-sky-50/40">
                <div className="mx-auto flex max-w-4xl flex-col gap-6 px-5 py-8">
                    {/* Header */}
                    <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                        <div>
                            <h1 className="text-2xl font-bold text-slate-800">Kalender</h1>
                            <Link
                                href="/planner"
                                className="mt-0.5 inline-flex items-center gap-1 text-sm text-sky-500 transition-colors hover:text-sky-600"
                            >
                                ← Kembali ke Planner
                            </Link>
                        </div>
                        <div className="flex items-center gap-2">
                            <button
                                onClick={() => nav(prevMonth)}
                                className="calendar-nav-btn flex h-9 w-9 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition-colors hover:bg-slate-50"
                            >
                                <ChevronLeft className="h-5 w-5 text-slate-600" />
                            </button>
                            <span className="min-w-[140px] text-center font-semibold text-slate-700">
                                {MONTH_NAMES[mon - 1]} {year}
                            </span>
                            <button
                                onClick={() => nav(nextMonth)}
                                className="calendar-nav-btn flex h-9 w-9 shrink-0 items-center justify-center rounded-xl border border-slate-200 bg-white text-slate-600 shadow-sm transition-colors hover:bg-slate-50"
                            >
                                <ChevronRight className="h-5 w-5 text-slate-600" />
                            </button>
                        </div>
                    </div>

                    {/* Calendar */}
                    <div className="overflow-hidden rounded-2xl border border-sky-100 bg-white shadow-sm shadow-sky-50">
                        {/* Day names header */}
                        <div className="grid grid-cols-7 border-b border-sky-100 bg-sky-50/60">
                            {DAY_NAMES.map((d) => (
                                <div
                                    key={d}
                                    className="p-2 text-center text-xs font-semibold text-sky-400 uppercase tracking-wide"
                                >
                                    {d}
                                </div>
                            ))}
                        </div>

                        <div className="grid grid-cols-7">
                            {grid.map((day, i) => {
                                if (!day) {
                                    return (
                                        <div
                                            key={i}
                                            className="min-h-[80px] border-b border-r border-sky-50 bg-sky-50/30 p-1"
                                        />
                                    );
                                }

                                const dateStr = `${year}-${String(mon).padStart(2, '0')}-${String(day).padStart(2, '0')}`;
                                const dayTasks = tasksByDate[dateStr] ?? [];
                                const isToday = dateStr === today;

                                return (
                                    <Link
                                        key={i}
                                        href={`/planner?date=${dateStr}`}
                                        className={cn(
                                            'group min-h-[80px] border-b border-r border-sky-50 p-1.5 transition-colors hover:bg-sky-50',
                                            isToday && 'bg-sky-50/80',
                                        )}
                                    >
                                        <div
                                            className={cn(
                                                'mb-1 flex h-6 w-6 items-center justify-center rounded-full text-xs font-semibold',
                                                isToday
                                                    ? 'bg-sky-400 text-white'
                                                    : 'text-slate-600 group-hover:bg-sky-100',
                                            )}
                                        >
                                            {day}
                                        </div>
                                        <div className="flex flex-col gap-0.5">
                                            {dayTasks.slice(0, 3).map((t) => (
                                                <div key={t.id} className="flex items-center gap-1">
                                                    <div
                                                        className={cn(
                                                            'h-1.5 w-1.5 shrink-0 rounded-full',
                                                            TYPE_DOT[t.type],
                                                        )}
                                                    />
                                                    <span className="truncate text-[10px] text-slate-400">
                                                        {t.title}
                                                    </span>
                                                </div>
                                            ))}
                                            {dayTasks.length > 3 && (
                                                <span className="text-[10px] text-slate-400">
                                                    +{dayTasks.length - 3} lainnya
                                                </span>
                                            )}
                                        </div>
                                    </Link>
                                );
                            })}
                        </div>
                    </div>

                    {/* Legend */}
                    <div className="flex items-center gap-5 text-xs text-slate-400">
                        <div className="flex items-center gap-1.5">
                            <div className="h-2.5 w-2.5 rounded-full bg-sky-300" />
                            Materi
                        </div>
                        <div className="flex items-center gap-1.5">
                            <div className="h-2.5 w-2.5 rounded-full bg-amber-400" />
                            Kuis
                        </div>
                        <div className="flex items-center gap-1.5">
                            <div className="h-2.5 w-2.5 rounded-full bg-violet-400" />
                            Tugas
                        </div>
                        <div className="flex items-center gap-1.5">
                            <div className="h-2.5 w-2.5 rounded-full bg-slate-400" />
                            Pribadi
                        </div>
                    </div>
                </div>
            </div>
        </>
    );
}

PlannerCalendar.layout = (page: React.ReactNode) => <AppLayout breadcrumbs={breadcrumbs}>{page}</AppLayout>;
