"use client";

import {
  Check,
  ClipboardCheck,
  Clock3,
  MapPin,
  Navigation,
  Package,
  PackageCheck,
  RefreshCw,
  Search,
  Truck,
} from "lucide-react";
import { FormEvent, useCallback, useEffect, useMemo, useState } from "react";
import { useTenant } from "@/components/tenant-provider";

type DeliveryOrder = {
  id: number;
  orderNumber: string;
  trackingId: string;
  customerName: string;
  phone: string;
  address: string;
  city: string;
  pincode: string;
  status: string;
  estimatedDelivery: string;
  items: Array<{ id: number; quantity: number }>;
};

const deliveryStatuses = [
  ["packed", "Parcel picked up"],
  ["shipped", "In transit"],
  ["out_for_delivery", "Out for delivery"],
  ["delivered", "Delivered"],
];

export default function DeliveryDashboard() {
  const { tenant } = useTenant();
  const [orders, setOrders] = useState<DeliveryOrder[]>([]);
  const [query, setQuery] = useState("");
  const [selected, setSelected] = useState<DeliveryOrder | null>(null);
  const [status, setStatus] = useState("shipped");
  const [location, setLocation] = useState(`${tenant.city || tenant.brandName} Delivery Hub`);
  const [note, setNote] = useState("");
  const [loading, setLoading] = useState(true);
  const [saving, setSaving] = useState(false);
  const [toast, setToast] = useState("");

  const load = useCallback(async () => {
    setLoading(true);
    try {
      const response = await fetch("/api/orders");
      const data = (await response.json()) as { orders?: DeliveryOrder[] };
      setOrders((data.orders ?? []).filter((order) => order.status !== "cancelled"));
    } finally {
      setLoading(false);
    }
  }, []);

  useEffect(() => { void load(); }, [load]);
  useEffect(() => { if (!toast) return; const timer = window.setTimeout(() => setToast(""), 2300); return () => window.clearTimeout(timer); }, [toast]);

  const visible = useMemo(() => {
    const term = query.toLowerCase();
    return orders.filter((order) => !term || order.trackingId.toLowerCase().includes(term) || order.orderNumber.toLowerCase().includes(term) || order.customerName.toLowerCase().includes(term) || order.city.toLowerCase().includes(term));
  }, [orders, query]);

  async function postUpdate(event: FormEvent) {
    event.preventDefault();
    if (!selected) return;
    setSaving(true);
    try {
      const response = await fetch(`/api/orders/${selected.trackingId}`, {
        method: "PATCH",
        headers: { "Content-Type": "application/json" },
        body: JSON.stringify({ status, location, note }),
      });
      if (!response.ok) throw new Error();
      setOrders((current) => current.map((order) => order.id === selected.id ? { ...order, status } : order));
      setSelected((current) => current ? { ...current, status } : current);
      setNote("");
      setToast(`Scan posted for ${selected.trackingId}`);
    } catch {
      setToast("Update failed. Please try again.");
    } finally {
      setSaving(false);
    }
  }

  const activeCount = orders.filter((order) => !["delivered", "confirmed"].includes(order.status)).length;
  const outCount = orders.filter((order) => order.status === "out_for_delivery").length;
  const deliveredCount = orders.filter((order) => order.status === "delivered").length;

  return (
    <main className="min-h-[calc(100vh-72px)] bg-[#eef3f8] px-4 py-7 sm:px-7">
      <div className="mx-auto max-w-7xl">
        <div className="flex flex-wrap items-center justify-between gap-4"><div><div className="flex items-center gap-2 text-xs font-black uppercase tracking-[0.14em] text-[#155ee9]"><Navigation size={14} /> {tenant.brandName} Express</div><h1 className="mt-1 text-2xl font-black tracking-tight sm:text-3xl">Delivery control tower</h1><p className="mt-1 text-xs text-slate-500">Scan, route and complete customer deliveries.</p></div><button onClick={() => void load()} className="flex items-center gap-2 rounded-xl border border-slate-200 bg-white px-4 py-3 text-xs font-black shadow-sm"><RefreshCw size={15} /> Refresh jobs</button></div>

        <section className="mt-7 grid gap-4 sm:grid-cols-2 lg:grid-cols-4">{[[Package, "Ready for pickup", orders.filter((o) => ["confirmed", "packed"].includes(o.status)).length, "bg-blue-50 text-blue-600"], [Truck, "In transit", activeCount, "bg-violet-50 text-violet-600"], [Navigation, "Out for delivery", outCount, "bg-orange-50 text-orange-600"], [PackageCheck, "Delivered", deliveredCount, "bg-green-50 text-green-600"]].map(([Icon, label, value, style]) => { const CardIcon = Icon as React.ElementType; return <article key={String(label)} className="flex items-center gap-4 rounded-2xl border border-slate-200 bg-white p-5 shadow-sm"><span className={`grid h-11 w-11 place-items-center rounded-xl ${String(style)}`}><CardIcon size={20} /></span><div><p className="text-2xl font-black">{String(value)}</p><p className="mt-0.5 text-[10px] font-bold text-slate-400">{String(label)}</p></div></article>; })}</section>

        <section className="mt-5 grid gap-5 lg:grid-cols-[1.15fr_0.85fr]">
          <div className="overflow-hidden rounded-2xl border border-slate-200 bg-white shadow-sm">
            <div className="border-b border-slate-100 p-5"><div className="flex flex-wrap items-center justify-between gap-3"><div><h2 className="font-black">Shipment queue</h2><p className="mt-1 text-[10px] text-slate-400">Select a parcel to post a scan</p></div><div className="relative"><Search size={15} className="absolute left-3 top-1/2 -translate-y-1/2 text-slate-400" /><input value={query} onChange={(event) => setQuery(event.target.value)} className="h-9 w-56 rounded-lg border border-slate-200 pl-9 pr-3 text-xs outline-none focus:border-blue-500" placeholder="Tracking ID or customer" /></div></div></div>
            <div className="max-h-[590px] divide-y divide-slate-100 overflow-y-auto">{loading ? <div className="p-14 text-center text-xs font-bold text-slate-400">Loading delivery jobs…</div> : visible.length === 0 ? <div className="p-14 text-center"><Truck className="mx-auto text-slate-300" size={35} /><p className="mt-3 text-sm font-black">No shipments found</p><p className="mt-1 text-xs text-slate-400">Orders ready for dispatch will appear here.</p></div> : visible.map((order) => <button key={order.id} onClick={() => { setSelected(order); setStatus(order.status === "confirmed" ? "packed" : order.status === "delivered" ? "delivered" : order.status); }} className={`flex w-full items-center gap-4 p-4 text-left hover:bg-blue-50/60 ${selected?.id === order.id ? "bg-blue-50" : ""}`}><span className={`grid h-11 w-11 shrink-0 place-items-center rounded-xl ${order.status === "delivered" ? "bg-green-100 text-green-600" : order.status === "out_for_delivery" ? "bg-orange-100 text-orange-600" : "bg-blue-100 text-[#155ee9]"}`}><Package size={20} /></span><div className="min-w-0 flex-1"><div className="flex items-center gap-2"><p className="font-black text-[#155ee9]">{order.trackingId}</p><span className="rounded-full bg-slate-100 px-2 py-0.5 text-[8px] font-black capitalize text-slate-500">{order.status.replaceAll("_", " ")}</span></div><p className="mt-1 truncate text-xs font-bold">{order.customerName} • {order.city}</p><p className="mt-1 truncate text-[9px] text-slate-400">{order.address}, {order.pincode}</p></div><div className="text-right"><p className="text-[9px] font-bold text-slate-400">{order.items.reduce((sum, item) => sum + item.quantity, 0)} item(s)</p><p className="mt-1 text-[9px] text-slate-400">Due {new Date(order.estimatedDelivery).toLocaleDateString("en-IN", { day: "numeric", month: "short" })}</p></div></button>)}</div>
          </div>

          <aside className="h-fit rounded-2xl border border-slate-200 bg-white shadow-sm lg:sticky lg:top-5">
            {!selected ? <div className="flex min-h-[500px] flex-col items-center justify-center p-7 text-center"><span className="grid h-20 w-20 place-items-center rounded-full bg-blue-50 text-[#155ee9]"><ClipboardCheck size={33} /></span><h2 className="mt-5 text-lg font-black">Select a shipment</h2><p className="mt-2 max-w-xs text-xs leading-5 text-slate-500">Choose a parcel from the queue to view delivery details and post a status scan.</p></div> : <><div className="border-b border-slate-100 p-5"><div className="flex items-start justify-between"><div><p className="text-[9px] font-black uppercase tracking-wider text-slate-400">Update shipment</p><h2 className="mt-1 text-lg font-black text-[#155ee9]">{selected.trackingId}</h2></div><span className="rounded-lg bg-slate-100 px-2 py-1 text-[9px] font-black">{selected.orderNumber}</span></div></div><div className="p-5"><div className="rounded-xl bg-[#0b2756] p-4 text-white"><div className="flex gap-3"><MapPin className="mt-0.5 shrink-0 text-[#ffd54a]" size={18} /><div><p className="text-xs font-black">{selected.customerName}</p><p className="mt-1 text-[10px] leading-5 text-blue-100">{selected.address}<br />{selected.city} — {selected.pincode}</p><a href={`tel:${selected.phone}`} className="mt-2 inline-block text-[10px] font-bold text-[#ffd54a]">{selected.phone}</a></div></div></div><form onSubmit={postUpdate} className="mt-5 space-y-4"><label className="input-label">Delivery status<select value={status} onChange={(event) => setStatus(event.target.value)} className="checkout-input">{deliveryStatuses.map(([value, label]) => <option key={value} value={value}>{label}</option>)}</select></label><label className="input-label">Scan location<input required value={location} onChange={(event) => setLocation(event.target.value)} className="checkout-input" placeholder="Current hub or locality" /></label><label className="input-label">Driver note (optional)<textarea value={note} onChange={(event) => setNote(event.target.value)} className="checkout-input resize-none" rows={3} placeholder="Add delivery instructions or proof note" /></label><div className="flex items-center gap-2 rounded-xl bg-orange-50 p-3"><Clock3 size={16} className="shrink-0 text-orange-600" /><p className="text-[9px] leading-4 text-orange-700">This update is immediately visible to the customer and Parsoni admin.</p></div><button disabled={saving} className="flex w-full items-center justify-center gap-2 rounded-xl bg-[#155ee9] px-4 py-3.5 text-xs font-black text-white disabled:opacity-60">{saving ? "Posting scan…" : "Post tracking update"}<Check size={15} /></button></form></div></>}
          </aside>
        </section>
      </div>
      {toast && <div className="fixed bottom-6 left-1/2 z-50 -translate-x-1/2 rounded-xl bg-[#101d37] px-5 py-3 text-xs font-bold text-white shadow-2xl">{toast}</div>}
    </main>
  );
}
