import { Head, Link } from "@inertiajs/react";
import { router } from "@inertiajs/react";
import { useState, useEffect, useMemo } from "react";

import {
    PageContainer,
    Card,
    formatDate,
    StatusBadge,
    ConfirmModal,
    useRole,
    Pagination,
    ViewViolationModal,
} from "./ViolationUI";
import { PaymentModal, PaymentSummaryModal } from "./PaymentModal";
import { ExportReportModal } from "./ExportReportModal";

const styles = `
  @keyframes fadeInDown {
    from { opacity: 0; transform: translateY(-16px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  @keyframes fadeInUp {
    from { opacity: 0; transform: translateY(20px); }
    to   { opacity: 1; transform: translateY(0); }
  }
  @keyframes fadeIn {
    from { opacity: 0; }
    to   { opacity: 1; }
  }

  .page-enter { animation: fadeIn 0.4s ease both; }
  .filter-bar-enter { animation: fadeInDown 0.4s ease both; }
  .row-enter {
    animation: fadeInUp 0.35s ease both;
    animation-fill-mode: both;
  }
 .row-hover        { transition: background 0.15s ease, transform 0.15s ease, box-shadow 0.15s ease; }
`;

const PAGE_SIZE = 10;

export default function Index({ violations }) {
    const [search, setSearch] = useState("");
    const [statusFilter, setStatusFilter] = useState("");
    const [dateFilter, setDateFilter] = useState("");
    const [offenseFilter, setOffenseFilter] = useState("");
    const [yearFilter, setYearFilter] = useState("");
    const [confirmId, setConfirmId] = useState(null);
    const [changeRequestTarget, setChangeRequestTarget] = useState(null); // { id, type }
    const [viewTarget, setViewTarget] = useState(null);
    const [page, setPage] = useState(1);

    const [paymentTarget, setPaymentTarget] = useState(null);
    const [paidResult, setPaidResult] = useState(null);
    const [paymentToast, setPaymentToast] = useState(null);

    const [mounted, setMounted] = useState(false);
    const { isAdmin, isSuperadmin, isAdminOrAbove } = useRole();

    const [showReportModal, setShowReportModal] = useState(false);

    const availableYears = useMemo(() => {
        const currentYear = new Date().getFullYear();
        const years = violations
            .map(
                (v) =>
                    v.date_of_violation &&
                    new Date(v.date_of_violation).getFullYear(),
            )
            .filter(Boolean);
        const minYear = years.length ? Math.min(...years) : currentYear;
        const result = [];
        for (let y = currentYear; y >= minYear; y--) result.push(y);
        return result;
    }, [violations]);

    useEffect(() => {
        const t = setTimeout(() => setMounted(true), 10);
        return () => clearTimeout(t);
    }, []);

    useEffect(() => {
        setPage(1);
    }, [search, statusFilter, dateFilter, offenseFilter, yearFilter]);

    const filtered = violations
        .filter((v) => {
            const matchesSearch =
                `${v.violation_number} ${v.violator.first_name} ${v.violator.last_name} ${v.violation_type?.name ?? ""} ${v.location}`
                    .toLowerCase()
                    .includes(search.toLowerCase());
            const matchesStatus = statusFilter
                ? v.status === statusFilter
                : true;
            const matchesDate = dateFilter
                ? v.date_of_violation.startsWith(dateFilter)
                : true;
            const matchesOffense = offenseFilter
                ? v.offense_number === Number(offenseFilter)
                : true;
            const matchesYear = yearFilter
                ? v.date_of_violation.startsWith(yearFilter)
                : true;
            return (
                matchesSearch &&
                matchesStatus &&
                matchesDate &&
                matchesOffense &&
                matchesYear
            );
        })
        .sort((a, b) => {
            const aPaid = a.status === "paid" ? 1 : 0;
            const bPaid = b.status === "paid" ? 1 : 0;
            return (
                aPaid - bPaid ||
                (a.violator?.last_name ?? "").localeCompare(
                    b.violator?.last_name ?? "",
                ) ||
                (a.violator?.first_name ?? "").localeCompare(
                    b.violator?.first_name ?? "",
                )
            );
        });

    const totalPages = Math.max(1, Math.ceil(filtered.length / PAGE_SIZE));

    useEffect(() => {
        if (page > totalPages) setPage(totalPages);
    }, [totalPages, page]);

    const paginated = filtered.slice((page - 1) * PAGE_SIZE, page * PAGE_SIZE);

    function handleDelete() {
        if (!confirmId) return;
        router.delete(route("violations.destroy", { violation: confirmId }), {
            data: { source: "index" },
            preserveScroll: true,
            onSuccess: () => setConfirmId(null),
            onError: () => setConfirmId(null),
        });
    }
    function handlePaid(result) {
        setPaymentTarget(null);
        setPaidResult(result);
    }

    function handleFinishPayment() {
        const message = paidResult
            ? `Payment recorded successfully. Receipt #${paidResult.receiptNumber}.`
            : null;

        setPaidResult(null);
        router.reload({ only: ["violations"] });

        if (message) {
            setPaymentToast(message);
            setTimeout(() => setPaymentToast(null), 3000);
        }
    }
    function handleSubmitChangeRequest() {
        if (!changeRequestTarget) return;
        router.post(
            route("violations.change-request", changeRequestTarget.id),
            { type: changeRequestTarget.type },
            {
                preserveScroll: true,
                onSuccess: () => setChangeRequestTarget(null),
                onError: () => setChangeRequestTarget(null),
            },
        );
    }

    function resetFilters() {
        setSearch("");
        setStatusFilter("");
        setDateFilter("");
        setOffenseFilter("");
        setYearFilter("");
        setPage(1);
    }

    return (
        <div>
            <style>{styles}</style>
            <Head title="Violations" />
            <PageContainer>
                <PaymentModal
                    violator={paymentTarget}
                    open={!!paymentTarget}
                    onClose={() => setPaymentTarget(null)}
                    onPaid={handlePaid}
                />
                <PaymentSummaryModal
                    open={!!paidResult}
                    payment={paidResult}
                    onFinish={handleFinishPayment}
                />
                <ConfirmModal
                    open={!!confirmId}
                    title="Delete Violation"
                    message="Are you sure you want to delete this violation? This action cannot be undone."
                    onConfirm={handleDelete}
                    onCancel={() => setConfirmId(null)}
                />

                <ConfirmModal
                    open={!!changeRequestTarget}
                    title="Submit Delete Request"
                    message="This will send a delete request to the superadmin for approval. The violation will not be deleted until approved."
                    confirmLabel="Submit Request"
                    confirmClassName="bg-orange-600 hover:bg-orange-700"
                    onConfirm={handleSubmitChangeRequest}
                    onCancel={() => setChangeRequestTarget(null)}
                />

                <ViewViolationModal
                    open={!!viewTarget}
                    violation={viewTarget}
                    onClose={() => setViewTarget(null)}
                />

                <ExportReportModal
                    open={showReportModal}
                    onClose={() => setShowReportModal(false)}
                    availableYears={availableYears}
                />

                {/* Header */}
                <div className={`mb-8 ${mounted ? "page-enter" : "opacity-0"}`}>
                    <div className="flex justify-between mb-2 items-center">
                        {isSuperadmin && (
                            <Link
                                href={route("violations.archived")}
                                className="flex items-center gap-2 px-5 py-2.5 bg-slate-200 text-slate-700 rounded-lg hover:bg-blue-200 dark:bg-slate-700 dark:text-slate-200 dark:hover:bg-[#13265C] transition"
                            >
                                <img
                                    src="/images/archived.svg"
                                    alt="Archive"
                                    className="w-4 h-4 dark:invert"
                                />
                                View Archived
                            </Link>
                        )}
                        <div className={`${isSuperadmin ? "text-center" : ""}`}>
                            <h1 className="text-3xl font-bold text-slate-900 dark:text-white">
                                Violations
                            </h1>
                            <p className="text-slate-600 mt-2 dark:text-slate-400">
                                All recorded violation cases
                            </p>
                        </div>
                        <Link
                            href={route("violations.create", {
                                from: "violations.index",
                            })}
                            className="px-5 py-2.5 bg-blue-50 text-blue-500 border border-blue-200 hover:bg-blue-100 rounded-lg transition font-bold"
                        >
                            + File a Violation
                        </Link>
                    </div>
                </div>

                {/* Card + filters */}
                <div className={mounted ? "filter-bar-enter" : "opacity-0"}>
                    <Card>
                        <div className="flex gap-3 mb-4">
                            <input
                                type="text"
                                value={search}
                                onChange={(e) => setSearch(e.target.value)}
                                placeholder="Search violator, type, or location…"
                                className="flex-1 rounded-lg border border-slate-300 px-4 py-2.5 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100"
                            />
                            <select
                                value={statusFilter}
                                onChange={(e) =>
                                    setStatusFilter(e.target.value)
                                }
                                className="rounded-lg border border-slate-300 px-4 py-2.5 pr-8 focus:border-blue-500 focus:ring-2 focus:ring-gray-200 outline-none hover:bg-gray-100 cursor-pointer text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100"
                            >
                                <option value="">All Statuses</option>
                                <option
                                    value="pending"
                                    className="px-4 py-3 text-[#FF692A] font-bold"
                                >
                                    Pending
                                </option>
                                <option
                                    value="paid"
                                    className="px-4 py-3 text-[#31C950]  font-bold"
                                >
                                    Paid
                                </option>
                            </select>
                            <select
                                value={offenseFilter}
                                onChange={(e) =>
                                    setOffenseFilter(e.target.value)
                                }
                                className="rounded-lg border border-slate-300 px-4 py-2.5 pr-8 focus:border-blue-500 focus:ring-2 focus:ring-gray-200 outline-black hover:bg-gray-100 cursor-pointer text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100"
                            >
                                <option value="">Offenses</option>
                                <option
                                    value="1"
                                    className="px-4 py-3 text-[#31C950]  font-bold"
                                >
                                    1st
                                </option>
                                <option
                                    value="2"
                                    className="px-4 py-3 text-[#FF692A] font-bold"
                                >
                                    2nd
                                </option>
                                <option
                                    value="3"
                                    className="px-4 py-3 text-[#FB2C36] font-bold"
                                >
                                    3rd
                                </option>
                            </select>
                            <input
                                type="month"
                                value={dateFilter}
                                onChange={(e) => setDateFilter(e.target.value)}
                                className="rounded-lg border border-slate-300 px-4 py-2.5 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100"
                            />
                            <input
                                type="year"
                                value={yearFilter}
                                onChange={(e) => setYearFilter(e.target.value)}
                                className="rounded-lg border border-slate-300 px-4 py-2.5 focus:border-blue-500 focus:ring-2 focus:ring-blue-200 outline-none text-sm dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100"
                                placeholder="Year e.g. 2026"
                            />
                            <button
                                type="button"
                                onClick={resetFilters}
                                className="inline-flex items-center gap-2 px-4 py-2 rounded-lg border border-gray-300 bg-white text-gray-700 font-medium shadow-sm hover:bg-gray-50 hover:border-gray-400 transition-all duration-200 dark:bg-slate-800 dark:border-slate-600 dark:text-slate-100 dark:hover:bg-slate-700"
                            >
                                Reset
                            </button>
                            {isAdminOrAbove && (
                                <button
                                    type="button"
                                    onClick={() => setShowReportModal(true)}
                                    className="inline-flex items-center gap-2 px-4 py-2 rounded-lg bg-blue-50 text-blue-600 border border-blue-200 font-medium shadow-sm hover:bg-blue-100 transition-all duration-200"
                                >
                                    Export Report
                                </button>
                            )}
                        </div>
                        <p className="text-xs text-slate-400 mb-3">
                            {filtered.length} total
                            {filtered.length === 1
                                ? " violation"
                                : " violations"}
                        </p>
                        {filtered.length === 0 ? (
                            <div className="flex flex-col items-center justify-center py-16 text-slate-400">
                                <svg
                                    width="80"
                                    height="80"
                                    viewBox="0 0 80 80"
                                    fill="none"
                                    xmlns="http://www.w3.org/2000/svg"
                                >
                                    <rect
                                        x="10"
                                        y="15"
                                        width="60"
                                        height="50"
                                        rx="6"
                                        fill="currentColor"
                                        opacity="0.08"
                                    />
                                    <rect
                                        x="18"
                                        y="25"
                                        width="44"
                                        height="5"
                                        rx="2.5"
                                        fill="currentColor"
                                        opacity="0.25"
                                    />
                                    <rect
                                        x="18"
                                        y="35"
                                        width="30"
                                        height="5"
                                        rx="2.5"
                                        fill="currentColor"
                                        opacity="0.18"
                                    />
                                    <rect
                                        x="18"
                                        y="45"
                                        width="38"
                                        height="5"
                                        rx="2.5"
                                        fill="currentColor"
                                        opacity="0.18"
                                    />
                                    <circle
                                        cx="58"
                                        cy="55"
                                        r="14"
                                        fill="currentColor"
                                        opacity="0.08"
                                    />
                                    <line
                                        x1="50"
                                        y1="55"
                                        x2="66"
                                        y2="55"
                                        stroke="currentColor"
                                        strokeWidth="2.5"
                                        strokeLinecap="round"
                                        opacity="0.4"
                                    />
                                </svg>
                                <p className="mt-4 text-sm font-medium">
                                    No violations recorded yet
                                </p>
                                <p className="text-xs mt-1 opacity-70">
                                    Filed violations will appear here
                                </p>
                            </div>
                        ) : (
                            <div className="overflow-x-auto">
                                <table className="w-full text-sm">
                                    <thead className="sticky top-0 z-10 bg-slate-100 dark:bg-slate-700">
                                        <tr className="border-b border-slate-200 dark:border-slate-700">
                                            {[
                                                "Ticket No.",
                                                "Violator",
                                                "Violation Type",
                                                "Offense #",
                                                "Fine",
                                                "Status",
                                                "Date",
                                                "Location",
                                                "View",
                                                isAdminOrAbove && "Actions",
                                            ]
                                                .filter(Boolean)
                                                .map((h) => (
                                                    <th
                                                        key={h}
                                                        className={`text-left px-4 py-3 font-semibold text-slate-500 ${
                                                            h === "Status"
                                                                ? "bg-slate-100 dark:bg-slate-700"
                                                                : h ===
                                                                    "Offense #"
                                                                  ? ""
                                                                  : ""
                                                        }`}
                                                    >
                                                        {h}
                                                    </th>
                                                ))}
                                        </tr>
                                    </thead>
                                    <tbody>
                                        {paginated.map((v, i) => (
                                            <tr
                                                key={v.id}
                                                className="border-b border-slate-100 row-enter row-hover dark:border-slate-700"
                                                style={{
                                                    animationDelay: `${i * 40}ms`,
                                                }}
                                            >
                                                <td className="px-6 py-4 font-mono text-slate-800 whitespace-nowrap">
                                                    {v.violation_number ?? "—"}
                                                </td>
                                                <td className="px-4 py-3 font-medium">
                                                    {v.violator.last_name},{" "}
                                                    {v.violator.first_name}
                                                </td>
                                                <td className="px-4 py-3">
                                                    {v.violation_type?.name ??
                                                        "—"}
                                                </td>
                                                <td className="px-4 py-3">
                                                    <span
                                                        className={`px-2 py-1 rounded-md font-bold text-sm ${
                                                            v.offense_number ===
                                                            1
                                                                ? "bg-green-50 text-green-700"
                                                                : v.offense_number ===
                                                                    2
                                                                  ? "bg-orange-50 text-orange-700"
                                                                  : "bg-red-50 text-red-700"
                                                        }`}
                                                    >
                                                        #{v.offense_number}
                                                    </span>
                                                </td>
                                                <td className="px-4 py-3 ">
                                                    ₱
                                                    {Number(
                                                        v.fine_amount,
                                                    ).toLocaleString()}
                                                </td>
                                                <td className="px-4 py-3">
                                                    <StatusBadge
                                                        violationId={v.id}
                                                        currentStatus={
                                                            v.status ??
                                                            "pending"
                                                        }
                                                    />
                                                </td>
                                                <td className="px-4 py-3 ">
                                                    {formatDate(
                                                        v.date_of_violation,
                                                    )}
                                                </td>
                                                <td className="px-4 py-3 ">
                                                    {v.location}
                                                </td>
                                                <td className="px-4 py-3">
                                                    <button
                                                        onClick={() =>
                                                            setViewTarget(v)
                                                        }
                                                        className="px-3 py-1 text-sm bg-blue-50 text-blue-600 rounded-md hover:bg-blue-100 transition"
                                                    >
                                                        View
                                                    </button>
                                                </td>
                                                {isAdminOrAbove && (
                                                    <td className="px-4 py-3">
                                                        <div className="flex gap-2 flex-wrap">
                                                            {v.status ===
                                                            "paid" ? (
                                                                <button
                                                                    disabled
                                                                    className="px-3 py-1 text-sm bg-slate-100 text-slate-400 rounded-md cursor-not-allowed"
                                                                >
                                                                    Paid
                                                                </button>
                                                            ) : (
                                                                <button
                                                                    onClick={() =>
                                                                        setPaymentTarget(
                                                                            v.violator,
                                                                        )
                                                                    }
                                                                    className="px-3 py-1 text-sm bg-green-50 text-green-600 rounded-md hover:bg-green-100 transition"
                                                                >
                                                                    Pay
                                                                </button>
                                                            )}
                                                            {isSuperadmin ? (
                                                                <>
                                                                    {/* Superadmin: direct edit */}
                                                                    {v.status ===
                                                                    "paid" ? (
                                                                        <button
                                                                            disabled
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-400 rounded-md cursor-not-allowed"
                                                                        >
                                                                            Edit
                                                                        </button>
                                                                    ) : (
                                                                        <Link
                                                                            href={route(
                                                                                "violations.edit",
                                                                                v.id,
                                                                            )}
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-700 rounded-md hover:bg-slate-200 transition"
                                                                        >
                                                                            Edit
                                                                        </Link>
                                                                    )}
                                                                    {/* Superadmin: direct delete */}
                                                                    {v.status ===
                                                                    "paid" ? (
                                                                        <button
                                                                            disabled
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-400 rounded-md cursor-not-allowed"
                                                                        >
                                                                            Delete
                                                                        </button>
                                                                    ) : (
                                                                        <button
                                                                            onClick={() =>
                                                                                setConfirmId(
                                                                                    v.id,
                                                                                )
                                                                            }
                                                                            className="px-3 py-1 text-sm bg-red-50 text-red-600 rounded-md hover:bg-red-100 transition"
                                                                        >
                                                                            Delete
                                                                        </button>
                                                                    )}
                                                                </>
                                                            ) : (
                                                                <>
                                                                    {/* Admin: request edit */}
                                                                    {v.status ===
                                                                    "paid" ? (
                                                                        <button
                                                                            disabled
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-400 rounded-md cursor-not-allowed"
                                                                        >
                                                                            Request
                                                                            Edit
                                                                        </button>
                                                                    ) : (
                                                                        <Link
                                                                            href={route(
                                                                                "violations.edit",
                                                                                v.id,
                                                                                {
                                                                                    from: "violations.index",
                                                                                },
                                                                            )}
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-700 rounded-md hover:bg-slate-200 transition"
                                                                        >
                                                                            Request
                                                                            Edit
                                                                        </Link>
                                                                    )}
                                                                    {/* Admin: request delete */}
                                                                    {v.status ===
                                                                    "paid" ? (
                                                                        <button
                                                                            disabled
                                                                            className="px-3 py-1 text-sm bg-slate-100 text-slate-400 rounded-md cursor-not-allowed"
                                                                        >
                                                                            Request
                                                                            Delete
                                                                        </button>
                                                                    ) : (
                                                                        <button
                                                                            onClick={() =>
                                                                                setChangeRequestTarget(
                                                                                    {
                                                                                        id: v.id,
                                                                                        type: "delete",
                                                                                    },
                                                                                )
                                                                            }
                                                                            className="px-3 py-1 text-sm bg-red-50 text-red-600 rounded-md hover:bg-red-100 transition"
                                                                        >
                                                                            Request
                                                                            Delete
                                                                        </button>
                                                                    )}
                                                                </>
                                                            )}
                                                        </div>
                                                    </td>
                                                )}
                                            </tr>
                                        ))}
                                    </tbody>
                                </table>
                                <Pagination
                                    currentPage={page}
                                    totalPages={totalPages}
                                    onPageChange={setPage}
                                />
                            </div>
                        )}
                    </Card>
                </div>
            </PageContainer>
            {paymentToast && (
                <div className="fixed bottom-6 right-6 z-50 toast-enter">
                    <div className="flex items-center gap-3 bg-white dark:bg-slate-800 border border-slate-200 dark:border-slate-700 pl-3 pr-5 py-3 rounded-2xl shadow-xl shadow-slate-900/10">
                        <div className="w-8 h-8 rounded-full bg-green-50 dark:bg-green-900/30 flex items-center justify-center shrink-0">
                            <span className="text-green-500 dark:text-green-400 text-base leading-none">
                                ✓
                            </span>
                        </div>
                        <p className="text-sm font-semibold text-slate-800 dark:text-slate-100">
                            {paymentToast}
                        </p>
                    </div>
                </div>
            )}
        </div>
    );
}
