import { cn } from "@/lib/utils";
import { humanize } from "@/lib/format";

const STYLES: Record<string, string> = {
  // order statuses
  AWAITING:
    "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",
  PENDING: "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400",
  IN_PROGRESS: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400",
  PROCESSING:
    "bg-indigo-100 text-indigo-700 dark:bg-indigo-500/15 dark:text-indigo-400",
  COMPLETED:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  PARTIAL:
    "bg-orange-100 text-orange-700 dark:bg-orange-500/15 dark:text-orange-400",
  CANCELED: "bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400",
  FAIL: "bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-400",
  ERROR: "bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-400",

  // shared lifecycle statuses
  ACTIVE:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  PAUSED: "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400",
  EXPIRED: "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",
  REJECTED: "bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400",
  SUCCESS:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  ANSWERED: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400",
  CLOSED: "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",

  // users, payments, payouts, service updates
  APPROVED:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  FAILED: "bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-400",
  UNCONFIRMED:
    "bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400",
  SUSPENDED: "bg-red-100 text-red-700 dark:bg-red-500/15 dark:text-red-400",
  INACTIVE: "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",
  ENABLED:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  DISABLED: "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",
  NEW: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400",
  RATE_UP: "bg-rose-100 text-rose-700 dark:bg-rose-500/15 dark:text-rose-400",
  RATE_DOWN:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  DEPOSIT:
    "bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400",
  ORDER: "bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400",
  REFUND:
    "bg-orange-100 text-orange-700 dark:bg-orange-500/15 dark:text-orange-400",
  BONUS: "bg-cyan-100 text-cyan-700 dark:bg-cyan-500/15 dark:text-cyan-400",
  FEE: "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300",
  AFFILIATE:
    "bg-violet-100 text-violet-700 dark:bg-violet-500/15 dark:text-violet-400",
  ADMIN_ADJUST:
    "bg-indigo-100 text-indigo-700 dark:bg-indigo-500/15 dark:text-indigo-400",
};

const FALLBACK =
  "bg-slate-100 text-slate-700 dark:bg-slate-500/15 dark:text-slate-300";

export function statusClasses(status: string | null | undefined): string {
  if (!status) return FALLBACK;
  return STYLES[status.toUpperCase()] ?? FALLBACK;
}

export function StatusBadge({
  status,
  label,
  className,
  dot = true,
}: {
  status: string | null | undefined;
  label?: string;
  className?: string;
  dot?: boolean;
}) {
  const text = label ?? humanize(status) ?? "";
  return (
    <span
      className={cn(
        "inline-flex items-center gap-1.5 rounded-full px-2 py-0.5 text-xs font-medium whitespace-nowrap",
        statusClasses(status),
        className,
      )}
    >
      {dot ? (
        <span className="size-1.5 shrink-0 rounded-full bg-current opacity-70" />
      ) : null}
      {text}
    </span>
  );
}

export default StatusBadge;
