import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout";
import { Head, router } from "@inertiajs/react";
import { useMemo, useState } from "react";
import {
    CalendarIcon,
    FunnelIcon,
    ChevronLeftIcon,
    ChevronRightIcon,
    BuildingOfficeIcon,
    UserIcon,
    CheckCircleIcon,
    XCircleIcon,
    InformationCircleIcon
} from '@heroicons/react/24/solid';

const statusLabelMap = {
    hadir: "Hadir",
    izin: "Izin",
    sakit: "Sakit",
    cuti: "Cuti",
    alpa: "Alpa",
};

const statusCellClassMap = {
    hadir: "bg-green-100 text-green-700 dark:bg-green-500/20 dark:text-green-300",
    izin: "bg-yellow-100 text-yellow-700 dark:bg-yellow-500/20 dark:text-yellow-300",
    sakit: "bg-blue-100 text-blue-700 dark:bg-blue-500/20 dark:text-blue-300",
    cuti: "bg-purple-100 text-purple-700 dark:bg-purple-500/20 dark:text-purple-300",
    alpa: "bg-red-100 text-red-700 dark:bg-red-500/20 dark:text-red-300",
    none: "bg-gray-100 text-gray-500 dark:bg-gray-700/40 dark:text-gray-400",
};

const statusShortMap = {
    hadir: "H",
    izin: "I",
    sakit: "S",
    cuti: "C",
    alpa: "A",
    none: "-",
};

export default function Index({
    rows = [],
    filters,
    bulanList = [],
    tahunList = [],
    isGlobal,
    kampusList = [],
    calendar,
    auth
}) {
    const [kampusId, setKampusId] = useState(filters?.kampus_id || "");
    const [bulan, setBulan] = useState(filters?.bulan || "");
    const [tahun, setTahun] = useState(filters?.tahun || "");
    const days = calendar?.days || [];

    const selectedMonthLabel = useMemo(() => {
        const hit = bulanList.find((b) => String(b.id) === String(bulan));
        return hit?.nama || "Bulan";
    }, [bulanList, bulan]);

    const selectedMonthYear = useMemo(() => {
        return `${tahun}-${String(bulan).padStart(2, "0")}`;
    }, [tahun, bulan]);

    const applyFilter = () => {
        router.get(
            route("keuangan.hris.rekap-absensi.index"),
            { kampus_id: kampusId, bulan, tahun },
            { preserveState: true, replace: true },
        );
    };

    const navigateMonth = (step) => {
        const currentMonth = Number.parseInt(String(bulan), 10) || 1;
        const currentYear = Number.parseInt(String(tahun), 10) || new Date().getFullYear();
        const baseDate = new Date(currentYear, currentMonth - 1, 1);
        baseDate.setMonth(baseDate.getMonth() + step);

        const nextMonth = String(baseDate.getMonth() + 1).padStart(2, "0");
        const nextYear = String(baseDate.getFullYear());
        setBulan(nextMonth);
        setTahun(nextYear);

        router.get(
            route("keuangan.hris.rekap-absensi.index"),
            { kampus_id: kampusId, bulan: nextMonth, tahun: nextYear },
            { preserveState: true, replace: true },
        );
    };

    const handleMonthPickerChange = (e) => {
        const value = e.target.value;
        if (!value) return;
        const [nextYear, nextMonth] = value.split("-");
        if (!nextYear || !nextMonth) return;
        setBulan(nextMonth);
        setTahun(nextYear);

        router.get(
            route("keuangan.hris.rekap-absensi.index"),
            { kampus_id: kampusId, bulan: nextMonth, tahun: nextYear },
            { preserveState: true, replace: true },
        );
    };

    const getStatusKey = (row, date) => row?.attendance_by_date?.[date] || "none";

    const hasActiveFilters = kampusId;

    return (
        <AuthenticatedLayout
            user={auth?.user}
            header={
                <h2 className="font-semibold text-xl flex items-center gap-2 text-gray-800 dark:text-gray-100">
                    <BuildingOfficeIcon className="w-6 h-6 text-purple-600 dark:text-purple-400" />
                    HRIS - Rekap Absensi Karyawan
                </h2>
            }
        >
            <Head title="Rekap Absensi Karyawan" />

            <div className="py-6">
                <div className="max-w-7xl mx-auto sm:px-6 lg:px-8">
                    {/* Filter Section */}
                    <div className="bg-white dark:bg-dark-300 rounded-xl border border-gray-200 dark:border-purple-500/20 overflow-hidden shadow-sm mb-6">
                        <div className="bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/10 dark:to-purple-900/20 px-6 py-4 border-b border-gray-200 dark:border-purple-500/20">
                            <div className="flex items-center justify-between">
                                <h3 className="font-semibold text-purple-900 dark:text-purple-100 flex items-center gap-2">
                                    <FunnelIcon className="w-5 h-5" />
                                    Filter Rekap Absensi
                                </h3>
                                {hasActiveFilters && (
                                    <span className="text-xs bg-purple-600 text-white px-2 py-1 rounded-full">
                                        Filter Aktif
                                    </span>
                                )}
                            </div>
                        </div>

                        <div className="p-6">
                            <div className="flex flex-col md:flex-row md:items-center md:justify-between gap-4">
                                {/* Navigasi Bulan */}
                                <div className="flex items-center gap-2 dark:text-white">
                                    <button
                                        type="button"
                                        onClick={() => navigateMonth(-1)}
                                        className="px-3 py-2 rounded-lg border border-purple-300 dark:border-purple-500/40 text-sm hover:bg-purple-50 dark:hover:bg-purple-900/30 transition-colors flex items-center gap-1"
                                    >
                                        <ChevronLeftIcon className="w-4 h-4" />
                                        <span className="hidden sm:inline">Sebelumnya</span>
                                    </button>
                                    
                                    <div className="px-4 py-2 rounded-lg bg-gradient-to-r from-purple-600 to-pink-600 text-white text-sm font-semibold shadow-lg shadow-purple-500/25 flex items-center gap-2">
                                        <CalendarIcon className="w-4 h-4" />
                                        {selectedMonthLabel} {tahun}
                                    </div>
                                    
                                    <button
                                        type="button"
                                        onClick={() => navigateMonth(1)}
                                        className="px-3 py-2 rounded-lg border border-purple-300 dark:border-purple-500/40 text-sm hover:bg-purple-50 dark:hover:bg-purple-900/30 transition-colors flex items-center gap-1"
                                    >
                                        <span className="hidden sm:inline">Berikutnya</span>
                                        <ChevronRightIcon className="w-4 h-4" />
                                    </button>
                                </div>

                                {/* Filter dan Picker */}
                                <div className="flex flex-wrap items-center gap-3">
                                    <div className="relative">
                                        <input
                                            type="month"
                                            value={selectedMonthYear}
                                            onChange={handleMonthPickerChange}
                                            className="pl-10 pr-4 py-2 border border-purple-300 dark:border-purple-500/40 rounded-lg bg-white dark:bg-purple-900/30 text-purple-900 dark:text-purple-100 focus:ring-2 focus:ring-purple-500 focus:border-purple-500 transition-all duration-200"
                                        />
                                        <CalendarIcon className="w-5 h-5 text-purple-500 absolute left-3 top-1/2 transform -translate-y-1/2" />
                                    </div>

                                    {isGlobal && (
                                        <>
                                            <select
                                                value={kampusId}
                                                onChange={(e) => setKampusId(e.target.value)}
                                                className="px-4 py-2 border border-purple-300 dark:border-purple-500/40 rounded-lg bg-white dark:bg-purple-900/30 text-purple-900 dark:text-purple-100 focus:ring-2 focus:ring-purple-500 focus:border-purple-500 transition-all duration-200"
                                            >
                                                <option value="">Semua Kampus</option>
                                                {kampusList.map((k) => (
                                                    <option key={k.id} value={k.id}>
                                                        {k.nama_kampus}
                                                    </option>
                                                ))}
                                            </select>
                                            
                                            <button
                                                type="button"
                                                onClick={applyFilter}
                                                className="px-4 py-2 bg-gradient-to-r from-purple-600 to-pink-600 text-white rounded-lg hover:from-purple-700 hover:to-pink-700 transition-all duration-200 font-medium shadow-lg shadow-purple-500/25 flex items-center gap-2"
                                            >
                                                <FunnelIcon className="w-4 h-4" />
                                                Terapkan
                                            </button>
                                        </>
                                    )}
                                </div>
                            </div>
                        </div>
                    </div>

                    {/* Status Legend */}
                    <div className="bg-white dark:bg-dark-300 rounded-xl border border-gray-200 dark:border-purple-500/20 overflow-hidden shadow-sm mb-6">
                        <div className="px-6 py-3 border-b border-gray-200 dark:border-purple-500/20 bg-gray-50 dark:bg-purple-900/10">
                            <div className="flex flex-wrap items-center gap-4">
                                <span className="text-sm font-medium text-purple-700 dark:text-purple-300 flex items-center gap-1">
                                    <InformationCircleIcon className="w-4 h-4" />
                                    Keterangan Status:
                                </span>
                                {Object.keys(statusLabelMap).map((status) => (
                                    <span
                                        key={status}
                                        className={`inline-flex items-center gap-1 px-2 py-1 rounded-md text-xs ${statusCellClassMap[status]}`}
                                    >
                                        <span className="font-bold">{statusShortMap[status]}</span>
                                        {statusLabelMap[status]}
                                    </span>
                                ))}
                                <span className={`inline-flex items-center gap-1 px-2 py-1 rounded-md text-xs ${statusCellClassMap.none}`}>
                                    <span className="font-bold">-</span>
                                    Tidak Ada Data
                                </span>
                            </div>
                        </div>
                    </div>

                    {/* Tabel Rekap */}
                    <div className="bg-white dark:bg-dark-300 rounded-xl border border-gray-200 dark:border-purple-500/20 overflow-hidden shadow-sm">
                        <div className="bg-gradient-to-r from-purple-50 to-pink-50 dark:from-purple-900/10 dark:to-purple-900/20 px-6 py-4 border-b border-gray-200 dark:border-purple-500/20">
                            <div className="flex items-center justify-between">
                                <div>
                                    <p className="font-semibold text-purple-900 dark:text-purple-100 flex items-center gap-2">
                                        <CalendarIcon className="w-5 h-5" />
                                        Kalender Absensi: {selectedMonthLabel} {tahun}
                                    </p>
                                    <p className="text-xs text-purple-700 dark:text-purple-300 mt-1">
                                        Data kehadiran karyawan per tanggal
                                    </p>
                                </div>
                                <div className="text-sm text-purple-700 dark:text-purple-300">
                                    Total Karyawan: {rows.length}
                                </div>
                            </div>
                        </div>

                        <div className="overflow-x-auto">
                            <table className="min-w-max w-full text-sm">
                                <thead className="bg-gray-100 dark:bg-purple-900/20 sticky top-0 z-10">
                                    <tr>
                                        <th className="px-4 py-3 text-left sticky left-0 z-20 bg-gray-100 dark:bg-purple-900/20 min-w-[250px]">
                                            <span className="font-semibold text-purple-900 dark:text-purple-100 flex items-center gap-2">
                                                <UserIcon className="w-4 h-4" />
                                                Karyawan
                                            </span>
                                        </th>
                                        {days.map((day) => (
                                            <th
                                                key={day.date}
                                                className={`px-2 py-3 text-center min-w-[54px] ${
                                                    day.is_weekend ? "text-red-500 dark:text-red-300" : "text-purple-900 dark:text-purple-100"
                                                }`}
                                                title={day.date}
                                            >
                                                <div className="text-xs leading-tight font-medium">{day.dow}</div>
                                                <div className="font-bold text-base">{day.day}</div>
                                            </th>
                                        ))}
                                        <th className="px-4 py-3 text-right min-w-[100px]">
                                            <span className="font-semibold text-purple-900 dark:text-purple-100 flex items-center justify-end gap-1">
                                                <CheckCircleIcon className="w-4 h-4 text-green-500" />
                                                Masuk
                                            </span>
                                        </th>
                                        <th className="px-4 py-3 text-right min-w-[110px]">
                                            <span className="font-semibold text-purple-900 dark:text-purple-100 flex items-center justify-end gap-1">
                                                <XCircleIcon className="w-4 h-4 text-red-500" />
                                                Tidak Masuk
                                            </span>
                                        </th>
                                    </tr>
                                </thead>
                                <tbody className="divide-y divide-gray-200 dark:divide-purple-500/20">
                                    {rows.map((row) => (
                                        <tr key={row.id} className="hover:bg-purple-50 dark:hover:bg-purple-900/10 transition-colors">
                                            <td className="px-4 py-3 sticky left-0 bg-white dark:bg-dark-300 z-10">
                                                <div className="flex flex-col">
                                                    <p className="font-medium text-gray-900 dark:text-white">{row.name}</p>
                                                    <p className="text-xs text-purple-600 dark:text-purple-400 capitalize flex items-center gap-1">
                                                        <BuildingOfficeIcon className="w-3 h-3" />
                                                        {row.role || "-"}
                                                    </p>
                                                </div>
                                            </td>
                                            {days.map((day) => {
                                                const status = getStatusKey(row, day.date);
                                                const short = statusShortMap[status] || statusShortMap.none;
                                                const statusClass = statusCellClassMap[status] || statusCellClassMap.none;
                                                const label = statusLabelMap[status] || "Tidak Ada Data";
                                                return (
                                                    <td key={`${row.id}-${day.date}`} className="px-2 py-3 text-center">
                                                        <span
                                                            className={`inline-flex w-8 h-8 items-center justify-center rounded-lg text-xs font-bold ${statusClass} shadow-sm`}
                                                            title={`${day.date} - ${label}`}
                                                        >
                                                            {short}
                                                        </span>
                                                    </td>
                                                );
                                            })}
                                            <td className="px-4 py-3 text-right">
                                                <span className="inline-flex items-center gap-1 font-semibold text-green-600 dark:text-green-400 bg-green-50 dark:bg-green-900/20 px-3 py-1 rounded-full">
                                                    <CheckCircleIcon className="w-3 h-3" />
                                                    {row.hadir_date_count}
                                                </span>
                                            </td>
                                            <td className="px-4 py-3 text-right">
                                                <span className="inline-flex items-center gap-1 font-semibold text-red-600 dark:text-red-400 bg-red-50 dark:bg-red-900/20 px-3 py-1 rounded-full">
                                                    <XCircleIcon className="w-3 h-3" />
                                                    {row.tidak_masuk_date_count}
                                                </span>
                                            </td>
                                        </tr>
                                    ))}
                                    {rows.length === 0 && (
                                        <tr>
                                            <td colSpan={days.length + 3} className="px-4 py-12 text-center">
                                                <div className="flex flex-col items-center justify-center text-gray-500 dark:text-gray-400">
                                                    <div className="p-3 rounded-full bg-gray-100 dark:bg-gray-800 mb-3">
                                                        <InformationCircleIcon className="w-8 h-8 text-gray-400 dark:text-gray-500" />
                                                    </div>
                                                    <p className="text-lg font-medium mb-1">Belum ada data rekap absensi</p>
                                                    <p className="text-sm">
                                                        {hasActiveFilters 
                                                            ? "Tidak ada data yang sesuai dengan filter yang dipilih." 
                                                            : "Belum ada data untuk periode ini."}
                                                    </p>
                                                </div>
                                            </td>
                                        </tr>
                                    )}
                                </tbody>
                            </table>
                        </div>

                        {/* Footer Info */}
                        {rows.length > 0 && (
                            <div className="px-6 py-3 bg-gray-50 dark:bg-purple-900/10 border-t border-gray-200 dark:border-purple-500/20 text-xs text-gray-500 dark:text-gray-400">
                                <div className="flex items-center gap-2">
                                    <InformationCircleIcon className="w-4 h-4" />
                                    <span>Klik pada badge status untuk melihat detail kehadiran karyawan.</span>
                                </div>
                            </div>
                        )}
                    </div>
                </div>
            </div>
        </AuthenticatedLayout>
    );
}