import { Head, Link, router, usePage } from '@inertiajs/react';
import { useState } from 'react';

import { ConfigurableTable } from '@/components/ui/configurable-table';
import { PaginationLinks } from '@/components/ui/pagination-links';
import { AdminLayout } from '@/layouts/admin-layout';
import { formatMoney } from '@/lib/money';
import type { AppPageProps, PaginatedData } from '@/types';

type CustomerRow = {
    id: number;
    name: string;
    email: string;
    phone: string | null;
    city: string | null;
    country: string | null;
    orders_count: number;
    orders_total_minor: number;
    created_at: string | null;
};

type CustomersIndexProps = {
    customers: PaginatedData<CustomerRow>;
    filters: {
        search: string;
    };
};

export default function AdminCustomersIndex({
    customers,
    filters,
}: CustomersIndexProps) {
    const { config } = usePage<AppPageProps>().props;
    const [search, setSearch] = useState(filters.search || '');

    const submitSearch = (event: React.FormEvent<HTMLFormElement>) => {
        event.preventDefault();

        router.get('/admin/customers', search ? { search } : {}, {
            preserveState: true,
            replace: true,
            preserveScroll: true,
        });
    };

    return (
        <AdminLayout>
            <Head title="Customers" />

            <div className="space-y-5">
                <div className="flex flex-wrap items-start justify-between gap-3">
                    <div>
                        <h1 className="text-2xl font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                            Customers
                        </h1>
                        <p className="mt-1 text-sm text-slate-600 dark:text-[#c7bde8]">
                            Manage customer profiles, contact details, and order
                            history.
                        </p>
                    </div>
                    <Link
                        href="/admin/customers/create"
                        className="rounded-lg bg-[#0b7285] px-4 py-2 text-sm font-semibold text-white hover:bg-[#095f6f] dark:bg-[#7c3aed] dark:hover:bg-[#8b5cf6]"
                    >
                        Create Customer
                    </Link>
                </div>

                <form
                    onSubmit={submitSearch}
                    className="flex max-w-xl flex-col gap-2 sm:flex-row"
                >
                    <input
                        value={search}
                        onChange={(event) => setSearch(event.target.value)}
                        placeholder="Search name, email, phone, or city"
                        className="w-full rounded-lg border border-slate-300 bg-white px-3 py-2 text-sm text-[#0a1530] outline-none focus:border-[#0b7285] dark:border-[#4a3a78] dark:bg-[#160f2d] dark:text-[#efe8ff] dark:focus:border-[#a78bfa]"
                    />
                    <button
                        type="submit"
                        className="rounded-lg border border-slate-300 px-3 py-2 text-sm font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                    >
                        Search
                    </button>
                </form>

                <div className="space-y-3 md:hidden">
                    {customers.data.map((customer) => (
                        <article
                            key={customer.id}
                            className="rounded-xl border border-slate-200 bg-white p-4 dark:border-[#3c2b68] dark:bg-[#211740]"
                        >
                            <p className="font-semibold text-[#0a1530] dark:text-[#efe8ff]">
                                {customer.name}
                            </p>
                            <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                {customer.email}
                            </p>
                            <div className="mt-3 grid grid-cols-2 gap-2 text-xs text-slate-700 dark:text-[#c7bde8]">
                                <p>Orders: {customer.orders_count}</p>
                                <p>
                                    Total:{' '}
                                    {formatMoney(
                                        customer.orders_total_minor,
                                        config.default_currency,
                                    )}
                                </p>
                                <p>Phone: {customer.phone || '-'}</p>
                                <p>City: {customer.city || '-'}</p>
                            </div>
                            <div className="mt-4 flex flex-wrap gap-2">
                                <Link
                                    href={`/admin/customers/${customer.id}`}
                                    className="inline-flex rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                                >
                                    View
                                </Link>
                                <Link
                                    href={`/admin/customers/${customer.id}/edit`}
                                    className="inline-flex rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                                >
                                    Edit
                                </Link>
                            </div>
                        </article>
                    ))}
                </div>

                <ConfigurableTable
                    tableId="admin-customers"
                    className="hidden overflow-x-auto rounded-xl border border-slate-200 md:block dark:border-[#3c2b68]"
                >
                    <table className="min-w-full divide-y divide-slate-200 text-sm dark:divide-[#3c2b68]">
                        <thead className="bg-slate-50 dark:bg-[#2a1d50]/70">
                            <tr>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Customer
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Location
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Orders
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Joined
                                </th>
                                <th className="px-4 py-3 text-left font-medium text-slate-700 dark:text-[#c7bde8]">
                                    Actions
                                </th>
                            </tr>
                        </thead>
                        <tbody className="divide-y divide-slate-100 bg-white dark:divide-[#3c2b68] dark:bg-[#211740]">
                            {customers.data.map((customer) => (
                                <tr key={customer.id}>
                                    <td className="px-4 py-3">
                                        <p className="font-medium text-[#0a1530] dark:text-[#efe8ff]">
                                            {customer.name}
                                        </p>
                                        <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                            {customer.email}
                                        </p>
                                        {customer.phone ? (
                                            <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                                {customer.phone}
                                            </p>
                                        ) : null}
                                    </td>
                                    <td className="px-4 py-3 text-slate-700 dark:text-[#c7bde8]">
                                        {[customer.city, customer.country]
                                            .filter(Boolean)
                                            .join(', ') || '-'}
                                    </td>
                                    <td className="px-4 py-3 text-slate-700 dark:text-[#c7bde8]">
                                        <p>{customer.orders_count} orders</p>
                                        <p className="text-xs text-slate-500 dark:text-[#bcaee6]">
                                            {formatMoney(
                                                customer.orders_total_minor,
                                                config.default_currency,
                                            )}
                                        </p>
                                    </td>
                                    <td className="px-4 py-3 text-slate-700 dark:text-[#c7bde8]">
                                        {customer.created_at || '-'}
                                    </td>
                                    <td className="px-4 py-3">
                                        <div className="flex flex-wrap gap-2">
                                            <Link
                                                href={`/admin/customers/${customer.id}`}
                                                className="rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                                            >
                                                View
                                            </Link>
                                            <Link
                                                href={`/admin/customers/${customer.id}/edit`}
                                                className="rounded-md border border-slate-300 px-2.5 py-1 text-xs font-medium text-slate-700 hover:bg-slate-100 dark:border-[#4a3a78] dark:text-[#e5dcff] dark:hover:bg-[#2a1d50]"
                                            >
                                                Edit
                                            </Link>
                                            <button
                                                type="button"
                                                onClick={() =>
                                                    deleteCustomer(customer.id)
                                                }
                                                className="rounded-md border border-rose-200 px-2.5 py-1 text-xs font-medium text-rose-700 hover:bg-rose-50 dark:border-rose-400/40 dark:text-rose-200 dark:hover:bg-rose-400/10"
                                            >
                                                Delete
                                            </button>
                                        </div>
                                    </td>
                                </tr>
                            ))}
                        </tbody>
                    </table>
                </ConfigurableTable>

                <div className="flex flex-col gap-3 sm:flex-row sm:items-center sm:justify-between">
                    <p className="text-sm text-slate-600 dark:text-[#c7bde8]">
                        Showing {customers.from || 0} to {customers.to || 0} of{' '}
                        {customers.total} customers
                    </p>
                    <PaginationLinks links={customers.links} />
                </div>
            </div>
        </AdminLayout>
    );
}

function deleteCustomer(id: number) {
    if (!window.confirm('Delete this customer?')) {
        return;
    }

    router.delete(`/admin/customers/${id}`);
}
