import { cn } from "@/lib/utils";
import type {
  OrderStatus,
  PaymentStatus,
  FulfillmentStatus,
} from "../types";

export type BadgeTone = "success" | "warning" | "danger" | "info" | "neutral";

interface StatusBadgeProps {
  label: string;
  tone: BadgeTone;
  dotClassName?: string;
  className?: string;
}

/**
 * A small, scannable status pill used across the orders module.
 */
export function StatusBadge({
  label,
  tone,
  dotClassName,
  className,
}: StatusBadgeProps) {
  const toneClasses: Record<BadgeTone, string> = {
    success:
      "border-green-600/15 bg-green-500/10 text-green-700 dark:border-green-400/20 dark:bg-green-400/10 dark:text-green-400",
    warning:
      "border-amber-600/15 bg-amber-500/10 text-amber-700 dark:border-amber-400/20 dark:bg-amber-400/10 dark:text-amber-400",
    danger:
      "border-red-600/15 bg-red-500/10 text-red-700 dark:border-red-400/20 dark:bg-red-400/10 dark:text-red-400",
    info:
      "border-sky-600/15 bg-sky-500/10 text-sky-700 dark:border-sky-400/20 dark:bg-sky-400/10 dark:text-sky-400",
    neutral:
      "border-border bg-muted text-muted-foreground dark:bg-muted/50",
  };

  return (
    <span
      className={cn(
        "inline-flex h-5 w-fit shrink-0 items-center gap-1.5 rounded-full border px-2.5 py-0 text-xs font-medium whitespace-nowrap",
        toneClasses[tone],
        className,
      )}
    >
      <span
        className={cn("size-1.5 shrink-0 rounded-full", dotClassName)}
        aria-hidden
      />
      {label}
    </span>
  );
}

// ── Status metadata ─────────────────────────────────────────────────────

interface StatusMeta {
  label: string;
  tone: BadgeTone;
  dotClassName: string;
}

export const orderStatusMeta: Record<OrderStatus, StatusMeta> = {
  pending: {
    label: "Pending",
    tone: "warning",
    dotClassName: "bg-amber-500",
  },
  processing: {
    label: "Processing",
    tone: "info",
    dotClassName: "bg-sky-500",
  },
  shipped: {
    label: "Shipped",
    tone: "info",
    dotClassName: "bg-indigo-500",
  },
  delivered: {
    label: "Delivered",
    tone: "success",
    dotClassName: "bg-green-500",
  },
  cancelled: {
    label: "Cancelled",
    tone: "danger",
    dotClassName: "bg-red-500",
  },
};

export const paymentStatusMeta: Record<PaymentStatus, StatusMeta> = {
  paid: {
    label: "Paid",
    tone: "success",
    dotClassName: "bg-green-500",
  },
  pending: {
    label: "Pending",
    tone: "warning",
    dotClassName: "bg-amber-500",
  },
  failed: {
    label: "Failed",
    tone: "danger",
    dotClassName: "bg-red-500",
  },
  refunded: {
    label: "Refunded",
    tone: "neutral",
    dotClassName: "bg-muted-foreground",
  },
  "partial-refund": {
    label: "Partially Refunded",
    tone: "warning",
    dotClassName: "bg-amber-500",
  },
};

export const fulfillmentStatusMeta: Record<
  FulfillmentStatus,
  StatusMeta
> = {
  unfulfilled: {
    label: "Unfulfilled",
    tone: "neutral",
    dotClassName: "bg-muted-foreground",
  },
  "partially-fulfilled": {
    label: "Partially Fulfilled",
    tone: "warning",
    dotClassName: "bg-amber-500",
  },
  fulfilled: {
    label: "Fulfilled",
    tone: "success",
    dotClassName: "bg-green-500",
  },
  cancelled: {
    label: "Cancelled",
    tone: "danger",
    dotClassName: "bg-red-500",
  },
};

// ── Convenience badges ──────────────────────────────────────────────────

export function OrderStatusBadge({
  status,
  className,
}: {
  status: OrderStatus;
  className?: string;
}) {
  const meta = orderStatusMeta[status];
  return (
    <StatusBadge
      label={meta.label}
      tone={meta.tone}
      dotClassName={meta.dotClassName}
      className={className}
    />
  );
}

export function PaymentStatusBadge({
  status,
  className,
}: {
  status: PaymentStatus;
  className?: string;
}) {
  const meta = paymentStatusMeta[status];
  return (
    <StatusBadge
      label={meta.label}
      tone={meta.tone}
      dotClassName={meta.dotClassName}
      className={className}
    />
  );
}

export function FulfillmentStatusBadge({
  status,
  className,
}: {
  status: FulfillmentStatus;
  className?: string;
}) {
  const meta = fulfillmentStatusMeta[status];
  return (
    <StatusBadge
      label={meta.label}
      tone={meta.tone}
      dotClassName={meta.dotClassName}
      className={className}
    />
  );
}