import {IPaginator, IUser, PageProps} from "@/types";
import AuthenticatedLayout from "@/Layouts/AuthenticatedLayout";
import {Head, Link, router, useForm, usePage} from "@inertiajs/react";
import PaginatorComponent from "@/Components/Paginator";
import EditIcon from "@mui/icons-material/Edit";
import DeleteIcon from "@mui/icons-material/Delete";
import ReceiptIcon from "@mui/icons-material/Receipt";
import NoFoodIcon from "@mui/icons-material/NoFood";
import PrimaryButton from "@/Components/PrimaryButton";
import Modal from "@/Components/Modal";
import {useEffect, useState} from "react";
import SearchBar from "@/Components/SearchBar";

export default function UserList({
                                     auth,
                                     users,
                                 }: PageProps<{ users: IPaginator<IUser> }>) {
    const [selectedUser, setSelectedUser] = useState<IUser | null>(null);
    const {delete: destroy} = useForm();
    const [showDeleteModal, setShowDeleteModal] = useState(false);
    const [processing, setProcessing] = useState(false);

    const handleDelete = () => {
        if (selectedUser) {
            setProcessing(true);
            setShowDeleteModal(false);
            destroy(route("admin.users.destroy", {id: selectedUser.id}), {
                onFinish: () => {
                    setProcessing(false);
                    setSelectedUser(null);
                },
            });
        }
    };

    const {url} = usePage();

    const [data, setData] = useState<{
        name: string | null;
    }>({
        name: null,
    });

    useEffect(() => {
        const params = new URLSearchParams(url.split("?")[1]);
        params.forEach((value, key) => {
            if (key === "name") {
                setData((prevData) => ({
                    ...prevData,
                    [key]: value,
                }));
            }
        });
    }, [url]);

    const handleSetData = (key: string, value: string | null) => {
        setData((prevData) => ({
            ...prevData,
            [key]: value,
        }));
    };

    const placeholders = {
        name: "Név",
    };
    const types = {
        name: "text",
    };

    const handleFilterFormSubmit = (e: React.FormEvent) => {
        e.preventDefault();
        router.get(
            route("admin.users.index", {
                _query: data,
            })
        );
    };

    const handleResetFilters = () => {
        setData({name: null});
        router.get(route("admin.users.index"));
    };

    return (
        <AuthenticatedLayout
            user={auth.user}
            header={"Felhasználó kezelés"}
            processing={processing}
        >
            <Head title="Felhasználó kezelés"/>
            <div className="m-4 flex flex-col space-y-4 sm:flex-row sm:space-y-0 sm:justify-between sm:items-center">
                <div className="w-full sm:w-auto">
                    <SearchBar
                        handleSubmit={handleFilterFormSubmit}
                        data={data}
                        setData={handleSetData}
                        handleReset={handleResetFilters}
                        placeholders={placeholders}
                        types={types}
                    />
                </div>
                <div className="flex justify-center sm:justify-end w-full sm:w-auto">
                    <Link
                        className="inline-flex items-center rounded-3xl px-4 py-2 bg-babolygo-purple border border-transparent font-semibold text-xs text-white uppercase tracking-widest hover:bg-purple-800 active:bg-purple-900 transition ease-in-out duration-150"
                        href={route("admin.users.create", {})}
                    >
                        Új felhasználó létrehozása
                    </Link>
                </div>
            </div>
            <div className="space-y-4 m-2">
                {users.data.map((user, index) => (
                    <div
                        key={user.id}
                        className={`p-4 rounded-lg shadow-md space-y-2 hover:bg-blue-300 ${
                            index % 2 === 0
                                ? "bg-babolygo-ocean"
                                : "bg-babolygo-ocean bg-opacity-45"
                        }`}
                    >
                        <div className="flex justify-between items-center">
                            <h2 className="text-lg font-semibold">
                                {user.full_name}
                            </h2>
                            <div className="flex space-x-2 items-center">
                                <Link
                                    className="inline-flex items-center rounded-3xl px-4 py-2 bg-orange-600 border border-transparent font-semibold text-xs text-white uppercase tracking-widest hover:bg-orange-800  active:bg-orange-900  transition ease-in-out duration-150"
                                    href={route("admin.users.cancellations.index", {
                                        id: user.id,
                                    })}
                                    title="Étkezés lemondás"
                                >
                                    <NoFoodIcon/>
                                </Link>
                                <Link
                                    className="inline-flex items-center rounded-3xl px-4 py-2 bg-blue-600 border border-transparent font-semibold text-xs text-white uppercase tracking-widest hover:bg-blue-800   active:bg-blue-900  transition ease-in-out duration-150"
                                    href={route("admin.users.invoices.index", {
                                        id: user.id,
                                    })}
                                    title="Számla kezelés"
                                >
                                    <ReceiptIcon/>
                                </Link>
                                <Link
                                    className="inline-flex items-center rounded-3xl px-4 py-2 bg-purple-600 border border-transparent font-semibold text-xs text-white uppercase tracking-widest hover:bg-purple-800   active:bg-purple-900  transition ease-in-out duration-150"
                                    href={route("admin.users.edit", {
                                        id: user.id,
                                    })}
                                    title="Módosítás"
                                >
                                    <EditIcon/>
                                </Link>
                                <PrimaryButton
                                    className="inline-flex items-center rounded-3xl px-4 py-2 bg-red-600 border border-transparent font-semibold text-xs text-white uppercase tracking-widest hover:bg-red-800   active:bg-red-900  transition ease-in-out duration-150"
                                    onClick={() => {
                                        setSelectedUser(user);
                                        setShowDeleteModal(true);
                                    }}
                                    title="Törlés"
                                >
                                    <DeleteIcon/>
                                </PrimaryButton>
                            </div>
                        </div>
                        <div className="flex flex-col">
                            <span>E-mail cím: {user.email}</span>
                            <span>Telefonszám: {user.phone_number}</span>
                            <div>Gyereki:</div>
                            <ul>
                                {user.kids && user.kids.length > 0 ? (
                                    user.kids.map((kid) => (
                                        <li key={kid.id}>{kid.full_name}</li>
                                    ))
                                ) : (
                                    <li>
                                        Jelenleg nincs hozzárendelve a gyerekei
                                    </li>
                                )}
                            </ul>
                        </div>
                    </div>
                ))}
            </div>
            <div className="m-5 flex justify-center">
                <PaginatorComponent {...users} />
            </div>
            <Modal
                show={showDeleteModal}
                onClose={() => setShowDeleteModal(false)}
            >
                <div className="p-6">
                    <h2 className="text-lg font-semibold mb-4">
                        Biztosan törölni szeretnéd?
                    </h2>
                    <p className="mb-4">Ez a művelet nem vonható vissza.</p>
                    <div className="flex justify-end">
                        <PrimaryButton
                            onClick={() => setShowDeleteModal(false)}
                            className=" mr-4"
                        >
                            Mégse
                        </PrimaryButton>
                        <PrimaryButton
                            onClick={handleDelete}
                            className="bg-red-600 text-white px-4 py-2 hover:bg-red-700"
                        >
                            Törlés
                        </PrimaryButton>
                    </div>
                </div>
            </Modal>
        </AuthenticatedLayout>
    );
}
