import { formatPrice, formatDateTime } from "@/lib/format";
import { ORDER_STATUS_META, type OrderStatus } from "@/lib/constants";

export type OrderView = {
  orderNumber: string;
  status: string;
  createdAt: Date | string;
  deliveryMethod: string;
  address: string | null;
  note: string | null;
  paymentMethod: string;
  customerName: string;
  customerPhone: string;
  customerEmail: string | null;
  subtotal: number;
  total: number;
  items: {
    id: string;
    titleSnapshot: string;
    priceSnapshot: number;
    quantity: number;
  }[];
};

export function OrderStatusBadge({ status }: { status: string }) {
  const meta =
    ORDER_STATUS_META[status as OrderStatus] ?? ORDER_STATUS_META.PENDING;
  return (
    <span
      className={`inline-flex items-center rounded-full px-2.5 py-0.5 text-xs font-semibold ${meta.className}`}
    >
      {meta.label}
    </span>
  );
}

export function OrderDetails({
  order,
  showCustomer = false,
}: {
  order: OrderView;
  showCustomer?: boolean;
}) {
  return (
    <div className="rounded-xl border border-slate-200 bg-white">
      <div className="flex flex-wrap items-center justify-between gap-2 border-b border-slate-100 px-5 py-4">
        <div>
          <p className="text-xs text-slate-400">Order number</p>
          <p className="font-bold text-slate-900">{order.orderNumber}</p>
        </div>
        <div className="text-right">
          <OrderStatusBadge status={order.status} />
          <p className="mt-1 text-xs text-slate-400">
            {formatDateTime(order.createdAt)}
          </p>
        </div>
      </div>

      <div className="divide-y divide-slate-100">
        {order.items.map((it) => (
          <div key={it.id} className="flex justify-between gap-2 px-5 py-3 text-sm">
            <span className="text-slate-700">
              {it.titleSnapshot}{" "}
              <span className="text-slate-400">× {it.quantity}</span>
            </span>
            <span className="shrink-0 font-medium">
              {formatPrice(it.priceSnapshot * it.quantity)}
            </span>
          </div>
        ))}
      </div>

      <div className="space-y-1 border-t border-slate-100 px-5 py-4 text-sm">
        <div className="flex justify-between">
          <span className="text-slate-500">Subtotal</span>
          <span>{formatPrice(order.subtotal)}</span>
        </div>
        <div className="flex justify-between font-bold">
          <span>Total</span>
          <span>{formatPrice(order.total)}</span>
        </div>
        <p className="pt-1 text-xs text-slate-400">
          Payment: Cash on {order.deliveryMethod === "PICKUP" ? "pickup" : "delivery"}
        </p>
      </div>

      <div className="grid gap-4 border-t border-slate-100 px-5 py-4 text-sm sm:grid-cols-2">
        <div>
          <p className="font-semibold text-slate-700">
            {order.deliveryMethod === "PICKUP" ? "Store pickup" : "Delivery to"}
          </p>
          {order.deliveryMethod === "DELIVERY" ? (
            <p className="mt-1 whitespace-pre-line text-slate-500">
              {order.address || "—"}
            </p>
          ) : (
            <p className="mt-1 text-slate-500">Collect from our shop.</p>
          )}
          {order.note ? (
            <p className="mt-2 text-slate-500">
              <span className="font-medium">Note:</span> {order.note}
            </p>
          ) : null}
        </div>
        {showCustomer ? (
          <div>
            <p className="font-semibold text-slate-700">Customer</p>
            <p className="mt-1 text-slate-500">{order.customerName}</p>
            <p className="text-slate-500">{order.customerPhone}</p>
            {order.customerEmail ? (
              <p className="text-slate-500">{order.customerEmail}</p>
            ) : null}
          </div>
        ) : null}
      </div>
    </div>
  );
}
