import { Head, Link, router, useForm } from '@inertiajs/react';
import { Eye, Package, Search, SlidersHorizontal } from 'lucide-react';
import { FormEventHandler } from 'react';

import { Button } from '@/components/ui/button';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { Input } from '@/components/ui/input';
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select';
import AdminLayout from '@/layouts/admin-layout';
import { type Order, type PaginatedData } from '@/types';

const STATUS_CONFIG: Record<string, { label: string; bg: string; dot: string }> = {
    new:       { label: 'New',       bg: 'bg-blue-50 text-blue-700 ring-blue-200',     dot: 'bg-blue-500' },
    pending:   { label: 'Pending',   bg: 'bg-yellow-50 text-yellow-700 ring-yellow-200', dot: 'bg-yellow-500' },
    confirmed: { label: 'Confirmed', bg: 'bg-indigo-50 text-indigo-700 ring-indigo-200', dot: 'bg-indigo-500' },
    packed:    { label: 'Packed',    bg: 'bg-purple-50 text-purple-700 ring-purple-200', dot: 'bg-purple-500' },
    shipped:   { label: 'Shipped',   bg: 'bg-orange-50 text-orange-700 ring-orange-200', dot: 'bg-orange-500' },
    delivered: { label: 'Delivered', bg: 'bg-green-50 text-green-700 ring-green-200',   dot: 'bg-green-500' },
    cancelled: { label: 'Cancelled', bg: 'bg-red-50 text-red-700 ring-red-200',         dot: 'bg-red-500' },
    returned:  { label: 'Returned',  bg: 'bg-slate-100 text-slate-600 ring-slate-200',  dot: 'bg-slate-400' },
};

const PAYMENT_CONFIG: Record<string, { label: string; bg: string }> = {
    paid:     { label: 'Paid',     bg: 'bg-green-50 text-green-700 ring-green-200' },
    unpaid:   { label: 'Unpaid',   bg: 'bg-red-50 text-red-700 ring-red-200' },
    partial:  { label: 'Partial',  bg: 'bg-yellow-50 text-yellow-700 ring-yellow-200' },
    refunded: { label: 'Refunded', bg: 'bg-slate-100 text-slate-600 ring-slate-200' },
};

function StatusBadge({ status }: { status: string }) {
    const cfg = STATUS_CONFIG[status] ?? { label: status, bg: 'bg-slate-100 text-slate-600 ring-slate-200', dot: 'bg-slate-400' };
    return (
        <span className={`inline-flex items-center gap-1.5 rounded-full px-2.5 py-1 text-xs font-medium ring-1 ${cfg.bg}`}>
            <span className={`h-1.5 w-1.5 rounded-full ${cfg.dot}`} />
            {cfg.label}
        </span>
    );
}

function PaymentBadge({ status }: { status: string }) {
    const cfg = PAYMENT_CONFIG[status] ?? { label: status, bg: 'bg-slate-100 text-slate-600 ring-slate-200' };
    return (
        <span className={`inline-flex rounded-full px-2.5 py-1 text-xs font-medium ring-1 ${cfg.bg}`}>
            {cfg.label}
        </span>
    );
}

interface Filters { status?: string; search?: string }

export default function AdminOrdersIndex({ orders, filters }: { orders: PaginatedData<Order>; filters: Filters }) {
    const { data, setData, get } = useForm({ search: filters.search ?? '', status: filters.status ?? '' });

    const applyFilters: FormEventHandler = (e) => {
        e.preventDefault();
        get(route('admin.orders.index'), { preserveState: true });
    };

    const clearFilters = () => {
        router.visit(route('admin.orders.index'));
    };

    const hasFilters = !!(filters.search || filters.status);

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

            {/* Header */}
            <div className="mb-6 flex flex-wrap items-center justify-between gap-3">
                <div className="flex items-center gap-2">
                    <Package size={20} className="text-indigo-600 dark:text-indigo-400" />
                    <h1 className="text-lg font-semibold text-slate-800 dark:text-slate-100">All Orders</h1>
                    <span className="rounded-full bg-slate-100 px-2.5 py-0.5 text-xs font-medium text-slate-600 dark:bg-slate-700 dark:text-slate-300">
                        {orders.total.toLocaleString()}
                    </span>
                </div>
            </div>

            {/* Filters */}
            <Card className="mb-4 dark:border-slate-700 dark:bg-slate-800">
                <CardContent className="p-3">
                    <form onSubmit={applyFilters} className="flex flex-wrap items-center gap-2">
                        <SlidersHorizontal size={15} className="text-slate-400" />
                        <div className="relative flex-1 min-w-48">
                            <Search size={14} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" />
                            <Input
                                placeholder="Invoice, name, phone…"
                                value={data.search}
                                onChange={(e) => setData('search', e.target.value)}
                                className="pl-8 h-9 dark:border-slate-600 dark:bg-slate-700"
                            />
                        </div>
                        <Select value={data.status || 'all'} onValueChange={(v) => setData('status', v === 'all' ? '' : v)}>
                            <SelectTrigger className="w-40 h-9 dark:border-slate-600 dark:bg-slate-700" aria-label="Filter by status">
                                <SelectValue placeholder="All statuses" />
                            </SelectTrigger>
                            <SelectContent>
                                <SelectItem value="all">All statuses</SelectItem>
                                {Object.entries(STATUS_CONFIG).map(([val, { label }]) => (
                                    <SelectItem key={val} value={val}>{label}</SelectItem>
                                ))}
                            </SelectContent>
                        </Select>
                        <Button type="submit" size="sm" className="h-9 bg-indigo-600 hover:bg-indigo-700">Filter</Button>
                        {hasFilters && (
                            <Button type="button" size="sm" variant="ghost" className="h-9" onClick={clearFilters}>Clear</Button>
                        )}
                    </form>
                </CardContent>
            </Card>

            {/* Table */}
            <Card className="dark:border-slate-700 dark:bg-slate-800">
                <CardContent className="p-0">
                    <div className="overflow-x-auto">
                        <table className="w-full text-sm">
                            <thead className="border-b bg-slate-50 dark:border-slate-700 dark:bg-slate-900/50">
                                <tr>
                                    <th className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">Invoice</th>
                                    <th className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">Customer</th>
                                    <th className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400 hidden md:table-cell">Phone</th>
                                    <th className="px-4 py-3 text-right text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">Amount</th>
                                    <th className="px-4 py-3 text-center text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400 hidden sm:table-cell">Payment</th>
                                    <th className="px-4 py-3 text-center text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400">Status</th>
                                    <th className="px-4 py-3 text-left text-xs font-semibold uppercase tracking-wide text-slate-500 dark:text-slate-400 hidden lg:table-cell">Date</th>
                                    <th className="px-4 py-3 w-16" />
                                </tr>
                            </thead>
                            <tbody className="divide-y dark:divide-slate-700">
                                {orders.data.map((order) => (
                                    <tr key={order.id} className="group transition hover:bg-slate-50 dark:hover:bg-slate-700/40">
                                        <td className="px-4 py-3.5">
                                            <span className="font-mono text-xs font-semibold text-indigo-600 dark:text-indigo-400">
                                                {order.invoice_no}
                                            </span>
                                        </td>
                                        <td className="px-4 py-3.5">
                                            <span className="font-medium text-slate-800 dark:text-slate-100">{order.customer_name}</span>
                                        </td>
                                        <td className="px-4 py-3.5 text-slate-500 dark:text-slate-400 hidden md:table-cell">{order.customer_phone}</td>
                                        <td className="px-4 py-3.5 text-right">
                                            <span className="font-bold text-slate-800 dark:text-slate-100">৳{Number(order.total_amount).toLocaleString()}</span>
                                        </td>
                                        <td className="px-4 py-3.5 text-center hidden sm:table-cell">
                                            <PaymentBadge status={order.payment_status} />
                                        </td>
                                        <td className="px-4 py-3.5 text-center">
                                            <StatusBadge status={order.order_status} />
                                        </td>
                                        <td className="px-4 py-3.5 text-xs text-slate-500 dark:text-slate-400 hidden lg:table-cell">
                                            {new Date(order.created_at).toLocaleDateString('en-BD', { day: '2-digit', month: 'short', year: 'numeric' })}
                                        </td>
                                        <td className="px-4 py-3.5">
                                            <Link
                                                href={`/admin/orders/${order.id}`}
                                                className="inline-flex items-center gap-1 rounded-lg border border-slate-200 bg-white px-2.5 py-1.5 text-xs font-medium text-slate-600 shadow-sm transition hover:border-indigo-300 hover:text-indigo-600 dark:border-slate-600 dark:bg-slate-700 dark:text-slate-300 dark:hover:text-indigo-400"
                                            >
                                                <Eye size={12} /> View
                                            </Link>
                                        </td>
                                    </tr>
                                ))}
                                {orders.data.length === 0 && (
                                    <tr>
                                        <td colSpan={8} className="px-4 py-16 text-center">
                                            <Package size={32} className="mx-auto mb-2 text-slate-300" />
                                            <p className="text-slate-400">No orders found</p>
                                            {hasFilters && (
                                                <button onClick={clearFilters} className="mt-2 text-sm text-indigo-500 hover:underline">
                                                    Clear filters
                                                </button>
                                            )}
                                        </td>
                                    </tr>
                                )}
                            </tbody>
                        </table>
                    </div>

                    {/* Pagination */}
                    {orders.last_page > 1 && (
                        <div className="flex items-center justify-between border-t px-4 py-3 dark:border-slate-700">
                            <span className="text-xs text-slate-500 dark:text-slate-400">
                                Showing <strong>{orders.from}</strong>–<strong>{orders.to}</strong> of <strong>{orders.total}</strong> orders
                            </span>
                            <div className="flex gap-1">
                                {orders.links.map((link, i) => (
                                    <button
                                        key={i}
                                        disabled={!link.url}
                                        onClick={() => link.url && router.visit(link.url)}
                                        className={`min-w-8 rounded-lg px-2 py-1.5 text-xs font-medium transition ${
                                            link.active
                                                ? 'bg-indigo-600 text-white'
                                                : 'border border-slate-200 text-slate-600 hover:bg-slate-50 disabled:opacity-40 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-700'
                                        }`}
                                        dangerouslySetInnerHTML={{ __html: link.label }}
                                    />
                                ))}
                            </div>
                        </div>
                    )}
                </CardContent>
            </Card>
        </AdminLayout>
    );
}
