import { Head, Link, router } from '@inertiajs/react';
import { CheckCircle, ClipboardList, Clock, GraduationCap, XCircle } from 'lucide-react';
import { useState } from 'react';
import { Button } from '@/components/ui/button';
import AppLayout from '@/layouts/app-layout';
import type { BreadcrumbItem } from '@/types';

type OrderItem = {
    id: number;
    course: { id: number; title: string };
};

type Order = {
    id: number;
    total_amount: number;
    status: 'pending' | 'approved' | 'rejected';
    proof_path: string | null;
    admin_notes: string | null;
    created_at: string;
    user: { id: number; name: string; email: string };
    items: OrderItem[];
};

type Paginator<T> = {
    data: T[];
    current_page: number;
    last_page: number;
    total: number;
    links: { url: string | null; label: string; active: boolean }[];
};

type Props = { orders: Paginator<Order> };

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Admin', href: '/admin' },
    { title: 'Pesanan', href: '/admin/orders' },
];

function formatPrice(price: number) {
    return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', maximumFractionDigits: 0 }).format(price);
}

const STATUS_CONFIG = {
    pending:  { label: 'Menunggu',  badge: 'bg-amber-100 text-amber-700',   stripe: 'bg-amber-400',   icon: Clock },
    approved: { label: 'Disetujui', badge: 'bg-emerald-100 text-emerald-700', stripe: 'bg-emerald-500', icon: CheckCircle },
    rejected: { label: 'Ditolak',   badge: 'bg-red-100 text-red-700',       stripe: 'bg-red-500',     icon: XCircle },
};

function getInitials(name: string) {
    return name.split(' ').slice(0, 2).map((n) => n[0]).join('').toUpperCase();
}

export default function AdminOrdersIndex({ orders }: Props) {
    const [rejectNotes, setRejectNotes] = useState<Record<number, string>>({});

    function approve(id: number) {
        router.post(`/admin/orders/${id}/approve`);
    }

    function reject(id: number) {
        router.post(`/admin/orders/${id}/reject`, { notes: rejectNotes[id] ?? '' });
    }

    return (
        <>
            <Head title="Pesanan" />

            <div className="flex flex-col gap-6 p-4 md:p-6">
                <div className="flex items-center justify-between">
                    <div>
                        <h1 className="text-2xl font-bold">Pesanan</h1>
                        <p className="text-sm text-muted-foreground">
                            <span className="font-semibold text-blue-600">{orders.total}</span> total pesanan
                        </p>
                    </div>
                    <div className="flex h-11 w-11 items-center justify-center rounded-2xl bg-blue-100 dark:bg-blue-900/30">
                        <ClipboardList className="h-5 w-5 text-blue-600" />
                    </div>
                </div>

                <div className="flex flex-col gap-4">
                    {orders.data.length === 0 && (
                        <div className="flex flex-col items-center justify-center rounded-2xl border border-dashed border-blue-200 py-16 text-center">
                            <ClipboardList className="mb-3 h-10 w-10 text-blue-200" />
                            <p className="font-semibold">Tidak ada pesanan</p>
                        </div>
                    )}

                    {orders.data.map((order) => {
                        const cfg = STATUS_CONFIG[order.status];
                        const StatusIcon = cfg.icon;
                        return (
                            <div key={order.id} className="overflow-hidden rounded-2xl border bg-white shadow-sm dark:bg-card">
                                <div className={`h-1 w-full ${cfg.stripe}`} />
                                <div className="p-5">
                                    <div className="flex flex-wrap items-start justify-between gap-3">
                                        <div className="flex items-start gap-3">
                                            <div className={`flex h-11 w-11 shrink-0 items-center justify-center rounded-xl bg-gradient-to-br text-sm font-bold text-white shadow-sm ${
                                                order.status === 'approved' ? 'from-emerald-400 to-teal-500' :
                                                order.status === 'rejected' ? 'from-red-400 to-rose-500' :
                                                'from-amber-400 to-orange-500'
                                            }`}>
                                                {getInitials(order.user.name)}
                                            </div>
                                            <div>
                                                <p className="font-semibold">{order.user.name}</p>
                                                <p className="text-sm text-muted-foreground">{order.user.email}</p>
                                                <p className="mt-1 text-sm">
                                                    <span className="text-muted-foreground">Kelas:</span>{' '}
                                                    <span className="font-medium">
                                                        {order.items.map((i) => i.course.title).join(', ')}
                                                    </span>
                                                </p>
                                            </div>
                                        </div>
                                        <div className="flex items-center gap-2">
                                            <span className="font-bold text-blue-600">{formatPrice(order.total_amount)}</span>
                                            <span className={`inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-xs font-semibold ${cfg.badge}`}>
                                                <StatusIcon className="h-3.5 w-3.5" />
                                                {cfg.label}
                                            </span>
                                        </div>
                                    </div>

                                    <div className="mt-3 flex flex-wrap items-center gap-3">
                                        <span className="text-xs text-muted-foreground">{order.created_at}</span>
                                        <Link
                                            href={`/admin/orders/${order.id}`}
                                            className="text-xs font-medium text-blue-600 hover:underline"
                                        >
                                            Lihat detail →
                                        </Link>
                                        {order.proof_path && (
                                            <a
                                                href={`/admin/orders/${order.id}/proof`}
                                                target="_blank"
                                                rel="noopener noreferrer"
                                                className="text-xs font-medium text-blue-600 hover:underline"
                                            >
                                                Bukti transfer ↗
                                            </a>
                                        )}
                                    </div>

                                    {order.status === 'pending' && (
                                        <div className="mt-4 flex flex-wrap items-end gap-3 border-t border-amber-100 pt-4 dark:border-amber-900/20">
                                            <div className="flex-1">
                                                <input
                                                    type="text"
                                                    placeholder="Catatan penolakan (opsional)..."
                                                    value={rejectNotes[order.id] ?? ''}
                                                    onChange={(e) => setRejectNotes((prev) => ({ ...prev, [order.id]: e.target.value }))}
                                                    className="w-full rounded-xl border border-input bg-transparent px-3 py-2 text-sm outline-none focus:border-blue-400 focus:ring-2 focus:ring-blue-100"
                                                />
                                            </div>
                                            <div className="flex gap-2">
                                                <Button
                                                    size="sm"
                                                    onClick={() => approve(order.id)}
                                                    className="gap-1.5 rounded-xl bg-emerald-600 hover:bg-emerald-700 shadow-sm"
                                                >
                                                    <CheckCircle className="h-4 w-4" />
                                                    Setujui
                                                </Button>
                                                <Button
                                                    size="sm"
                                                    variant="destructive"
                                                    onClick={() => reject(order.id)}
                                                    className="gap-1.5 rounded-xl"
                                                >
                                                    <XCircle className="h-4 w-4" />
                                                    Tolak
                                                </Button>
                                            </div>
                                        </div>
                                    )}
                                </div>
                            </div>
                        );
                    })}
                </div>

                {orders.last_page > 1 && (
                    <div className="flex items-center justify-center gap-1">
                        {orders.links.map((link, i) =>
                            link.url ? (
                                <Link
                                    key={i}
                                    href={link.url}
                                    className={`rounded-lg px-3 py-1.5 text-xs font-medium transition-colors ${link.active ? 'bg-blue-600 text-white shadow-sm' : 'border hover:bg-blue-50 hover:text-blue-700'}`}
                                    dangerouslySetInnerHTML={{ __html: link.label }}
                                />
                            ) : (
                                <span key={i} className="rounded-lg px-3 py-1.5 text-xs text-muted-foreground/50" dangerouslySetInnerHTML={{ __html: link.label }} />
                            ),
                        )}
                    </div>
                )}
            </div>
        </>
    );
}

AdminOrdersIndex.layout = (page: React.ReactNode) => <AppLayout breadcrumbs={breadcrumbs}>{page}</AppLayout>;
