import { Head, Link, router } from '@inertiajs/react';
import { CheckCircle, ChevronLeft, Clock, ExternalLink, GraduationCap, Package, Tag, User, XCircle } from 'lucide-react';
import { useState } from 'react';
import AppLayout from '@/layouts/app-layout';
import type { BreadcrumbItem } from '@/types';

type OrderItem = {
    id: number;
    price: number;
    course: { id: number; title: string; slug: string; thumbnail: string | null };
};

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

type Props = { order: Order };

const breadcrumbs: BreadcrumbItem[] = [
    { title: 'Admin', href: '/admin' },
    { title: 'Pembayaran', href: '/admin/payments' },
    { title: 'Detail Pesanan', href: '#' },
];

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

const STATUS_CONFIG = {
    pending:  {
        label: 'Menunggu Verifikasi',
        icon: Clock,
        badge: 'bg-amber-100 text-amber-700 dark:bg-amber-900/30 dark:text-amber-400',
        headerBg: 'from-amber-50 via-white to-orange-50 border-amber-100 dark:from-amber-950/30 dark:via-card dark:to-orange-950/20 dark:border-amber-800/30',
        iconBg: 'bg-amber-100 dark:bg-amber-800/60',
        iconColor: 'text-amber-600 dark:text-amber-300',
    },
    approved: {
        label: 'Disetujui',
        icon: CheckCircle,
        badge: 'bg-emerald-100 text-emerald-700 dark:bg-emerald-900/30 dark:text-emerald-400',
        headerBg: 'from-emerald-50 via-white to-teal-50 border-emerald-100 dark:from-emerald-950/30 dark:via-card dark:to-teal-950/20 dark:border-emerald-800/30',
        iconBg: 'bg-emerald-100 dark:bg-emerald-800/60',
        iconColor: 'text-emerald-600 dark:text-emerald-300',
    },
    rejected: {
        label: 'Ditolak',
        icon: XCircle,
        badge: 'bg-red-100 text-red-700 dark:bg-red-900/30 dark:text-red-400',
        headerBg: 'from-red-50 via-white to-rose-50 border-red-100 dark:from-red-950/30 dark:via-card dark:to-rose-950/20 dark:border-red-800/30',
        iconBg: 'bg-red-100 dark:bg-red-800/60',
        iconColor: 'text-red-600 dark:text-red-300',
    },
};

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

export default function AdminOrderShow({ order }: Props) {
    const [rejectNote, setRejectNote] = useState('');
    const cfg = STATUS_CONFIG[order.status];
    const StatusIcon = cfg.icon;
    const subtotal = order.total_amount + (order.discount_amount ?? 0);

    function approve() { router.post(`/admin/orders/${order.id}/approve`); }
    function reject()  { router.post(`/admin/orders/${order.id}/reject`, { notes: rejectNote }); }

    return (
        <>
            <Head title={`Pesanan #${order.id}`} />

            <div className="flex flex-col gap-6 p-4 md:p-6">

                {/* Header card */}
                <div className={`relative overflow-hidden rounded-2xl border bg-gradient-to-br p-5 shadow-sm ${cfg.headerBg}`}>
                    <div className="relative z-10 flex items-center justify-between">
                        <div className="flex items-center gap-3">
                            <Link
                                href="/admin/payments"
                                className="flex h-10 w-10 shrink-0 items-center justify-center rounded-xl bg-white/70 text-muted-foreground shadow-xs hover:bg-white hover:text-foreground transition-colors dark:bg-white/10"
                            >
                                <ChevronLeft className="h-5 w-5" />
                            </Link>
                            <div className={`flex h-10 w-10 shrink-0 items-center justify-center rounded-xl ${cfg.iconBg}`}>
                                <Package className={`h-5 w-5 ${cfg.iconColor}`} />
                            </div>
                            <div>
                                <div className="flex items-center gap-2">
                                    <h1 className="text-xl font-bold">Pesanan #{order.id}</h1>
                                    <span className={`inline-flex items-center gap-1 rounded-full px-2.5 py-0.5 text-xs font-medium ${cfg.badge}`}>
                                        <StatusIcon className="h-3 w-3" />
                                        {cfg.label}
                                    </span>
                                </div>
                                <p className="text-sm text-muted-foreground">{order.created_at}</p>
                            </div>
                        </div>
                        <div className="text-right">
                            <p className="text-xs text-muted-foreground">Total Pembayaran</p>
                            <p className="text-xl font-extrabold text-blue-600 dark:text-blue-400">{formatPrice(order.total_amount)}</p>
                        </div>
                    </div>
                    <div className="absolute -right-4 -top-4 h-20 w-20 rounded-full bg-white/20 dark:bg-white/5" />
                    <div className="absolute right-10 -bottom-6 h-28 w-28 rounded-full bg-white/10 dark:bg-white/3" />
                </div>

                <div className="grid gap-5 lg:grid-cols-[1fr_300px]">
                    {/* Left */}
                    <div className="flex flex-col gap-5">

                        {/* Pemesan */}
                        <div className="rounded-2xl border border-border bg-white p-5 shadow-sm dark:bg-card">
                            <div className="mb-4 flex items-center gap-2">
                                <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-blue-50 dark:bg-blue-900/30">
                                    <User className="h-3.5 w-3.5 text-blue-600 dark:text-blue-400" />
                                </div>
                                <h2 className="font-semibold">Informasi Pemesan</h2>
                            </div>
                            <div className="flex items-center gap-3">
                                <div className="flex h-12 w-12 shrink-0 items-center justify-center rounded-xl bg-blue-50 text-blue-700 text-sm font-bold dark:bg-blue-900/30 dark:text-blue-300">
                                    {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>
                                </div>
                            </div>
                        </div>

                        {/* Kelas dipesan */}
                        <div className="rounded-2xl border border-border bg-white p-5 shadow-sm dark:bg-card">
                            <div className="mb-4 flex items-center gap-2">
                                <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-blue-50 dark:bg-blue-900/30">
                                    <GraduationCap className="h-3.5 w-3.5 text-blue-600 dark:text-blue-400" />
                                </div>
                                <h2 className="font-semibold">Kelas Dipesan</h2>
                                <span className="ml-auto text-xs text-muted-foreground">{order.items.length} kelas</span>
                            </div>
                            <div className="divide-y divide-border">
                                {order.items.map((item) => (
                                    <div key={item.id} className="flex gap-3 py-3 first:pt-0 last:pb-0">
                                        {item.course.thumbnail ? (
                                            <img
                                                src={item.course.thumbnail}
                                                alt={item.course.title}
                                                className="h-16 w-24 shrink-0 rounded-xl object-cover"
                                            />
                                        ) : (
                                            <div className="flex h-16 w-24 shrink-0 items-center justify-center rounded-xl bg-blue-50 dark:bg-blue-900/20">
                                                <GraduationCap className="h-6 w-6 text-blue-300" />
                                            </div>
                                        )}
                                        <div className="min-w-0 flex-1">
                                            <p className="font-semibold leading-snug">{item.course.title}</p>
                                            <Link
                                                href={`/courses/${item.course.slug}`}
                                                className="mt-1 inline-flex items-center gap-1 text-xs text-blue-600 hover:underline dark:text-blue-400"
                                                target="_blank"
                                            >
                                                Lihat kelas <ExternalLink className="h-3 w-3" />
                                            </Link>
                                        </div>
                                        <span className="shrink-0 font-bold">{formatPrice(item.price)}</span>
                                    </div>
                                ))}
                            </div>
                        </div>

                        {/* Bukti transfer */}
                        {order.proof_path && (
                            <div className="rounded-2xl border border-border bg-white p-5 shadow-sm dark:bg-card">
                                <div className="mb-3 flex items-center gap-2">
                                    <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-blue-50 dark:bg-blue-900/30">
                                        <ExternalLink className="h-3.5 w-3.5 text-blue-600 dark:text-blue-400" />
                                    </div>
                                    <h2 className="font-semibold">Bukti Transfer</h2>
                                </div>
                                <a
                                    href={`/admin/orders/${order.id}/proof`}
                                    target="_blank"
                                    rel="noopener noreferrer"
                                    className="inline-flex items-center gap-2 rounded-xl bg-blue-50 border border-blue-100 px-4 py-2.5 text-sm font-semibold text-blue-700 transition-colors hover:bg-blue-100 dark:bg-blue-900/20 dark:border-blue-800/40 dark:text-blue-300"
                                >
                                    <ExternalLink className="h-4 w-4" />
                                    Buka file bukti transfer
                                </a>
                            </div>
                        )}

                        {/* Tindakan — hanya saat pending */}
                        {order.status === 'pending' && (
                            <div className="rounded-2xl border border-amber-100 bg-amber-50/60 p-5 dark:border-amber-800/30 dark:bg-amber-950/20">
                                <div className="mb-4 flex items-center gap-2">
                                    <div className="flex h-7 w-7 items-center justify-center rounded-lg bg-amber-100 dark:bg-amber-900/40">
                                        <Clock className="h-3.5 w-3.5 text-amber-600 dark:text-amber-400" />
                                    </div>
                                    <h2 className="font-semibold">Verifikasi Pembayaran</h2>
                                </div>
                                <div className="flex flex-col gap-3">
                                    <textarea
                                        rows={2}
                                        placeholder="Catatan penolakan (opsional, wajib diisi saat menolak)..."
                                        value={rejectNote}
                                        onChange={(e) => setRejectNote(e.target.value)}
                                        className="w-full resize-none rounded-xl border border-amber-200 bg-white px-4 py-2.5 text-sm outline-none placeholder:text-muted-foreground focus:border-amber-400 focus:ring-1 focus:ring-amber-300 dark:border-amber-800/40 dark:bg-card"
                                    />
                                    <div className="flex gap-3">
                                        <button
                                            onClick={reject}
                                            className="flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-red-200 bg-red-100 px-4 py-2.5 text-sm font-semibold text-red-700 transition-colors hover:bg-red-200 dark:border-red-900/40 dark:bg-red-950/40 dark:text-red-300"
                                        >
                                            <XCircle className="h-4 w-4" />
                                            Tolak Pembayaran
                                        </button>
                                        <button
                                            onClick={approve}
                                            className="flex flex-1 items-center justify-center gap-1.5 rounded-xl border border-emerald-200 bg-emerald-100 px-4 py-2.5 text-sm font-semibold text-emerald-800 transition-colors hover:bg-emerald-200 dark:border-emerald-900/40 dark:bg-emerald-950/40 dark:text-emerald-300"
                                        >
                                            <CheckCircle className="h-4 w-4" />
                                            Setujui & Aktivasi
                                        </button>
                                    </div>
                                </div>
                            </div>
                        )}

                        {/* Catatan penolakan */}
                        {order.status === 'rejected' && order.admin_notes && (
                            <div className="rounded-2xl border border-red-100 bg-red-50 p-5 dark:border-red-900/30 dark:bg-red-950/20">
                                <p className="mb-1 text-sm font-semibold text-red-700 dark:text-red-400">Alasan Penolakan</p>
                                <p className="text-sm text-red-600 dark:text-red-400">{order.admin_notes}</p>
                            </div>
                        )}
                    </div>

                    {/* Right: ringkasan */}
                    <div className="h-fit rounded-2xl border border-border bg-white p-5 shadow-sm dark:bg-card">
                        <h2 className="mb-4 font-semibold">Ringkasan Pesanan</h2>

                        {/* Status badge */}
                        <div className={`mb-4 inline-flex items-center gap-1.5 rounded-full px-3 py-1 text-sm font-medium ${cfg.badge}`}>
                            <StatusIcon className="h-4 w-4" />
                            {cfg.label}
                        </div>

                        {/* Item breakdown */}
                        <div className="space-y-2 text-sm">
                            {order.items.map((item) => (
                                <div key={item.id} className="flex justify-between gap-2 text-muted-foreground">
                                    <span className="min-w-0 flex-1 truncate">{item.course.title}</span>
                                    <span className="shrink-0 font-medium">{formatPrice(item.price)}</span>
                                </div>
                            ))}
                        </div>

                        {/* Diskon */}
                        {(order.discount_amount ?? 0) > 0 && (
                            <div className="mt-3 border-t border-border pt-3 space-y-1.5 text-sm">
                                <div className="flex justify-between text-muted-foreground">
                                    <span>Subtotal</span>
                                    <span>{formatPrice(subtotal)}</span>
                                </div>
                                <div className="flex justify-between items-center">
                                    <span className="flex items-center gap-1 text-emerald-600 dark:text-emerald-400">
                                        <Tag className="h-3.5 w-3.5" />
                                        Diskon kupon
                                    </span>
                                    <span className="font-semibold text-emerald-600 dark:text-emerald-400">
                                        -{formatPrice(order.discount_amount)}
                                    </span>
                                </div>
                            </div>
                        )}

                        <div className="mt-3 flex justify-between border-t border-border pt-3 font-bold">
                            <span>Total</span>
                            <span className="text-blue-600 dark:text-blue-400">{formatPrice(order.total_amount)}</span>
                        </div>

                        {/* Meta */}
                        <div className="mt-4 space-y-1.5 rounded-xl bg-muted/40 p-3 text-xs text-muted-foreground">
                            <div className="flex justify-between">
                                <span>No. Pesanan</span>
                                <span className="font-mono font-semibold text-foreground">#{order.id}</span>
                            </div>
                            <div className="flex justify-between">
                                <span>Dipesan</span>
                                <span className="text-foreground">{order.created_at}</span>
                            </div>
                            {order.approved_at && (
                                <div className="flex justify-between">
                                    <span>Disetujui</span>
                                    <span className="text-emerald-600 dark:text-emerald-400">{order.approved_at}</span>
                                </div>
                            )}
                        </div>
                    </div>
                </div>
            </div>
        </>
    );
}

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