import {
  AlertCircle,
  CheckCircle2,
  Clock3,
  Loader2,
  type LucideIcon,
} from "lucide-react";
import type { DuplicateStatus, InvoiceStatus } from "@/lib/ledger-types";
import { cn } from "@/lib/utils";

export type ClientFacingStatus = "processing" | "review" | "complete" | "action";

export const CLIENT_STATUS_META: Record<
  ClientFacingStatus,
  {
    label: string;
    hint: string;
    icon: LucideIcon;
    className: string;
  }
> = {
  processing: {
    label: "Processing",
    hint: "Reading document...",
    icon: Loader2,
    className: "bg-primary-soft text-primary border-primary/20",
  },
  review: {
    label: "Under review",
    hint: "Document processed — accountant review required.",
    icon: Clock3,
    className: "bg-attention-soft text-attention border-attention/25",
  },
  complete: {
    label: "Complete",
    hint: "Document approved.",
    icon: CheckCircle2,
    className: "bg-success-soft text-success border-success/20",
  },
  action: {
    label: "Action needed",
    hint: "Your accountant needs something from you.",
    icon: AlertCircle,
    className: "bg-destructive-soft text-destructive border-destructive/20",
  },
};

export function toClientStatus(status: InvoiceStatus): ClientFacingStatus {
  switch (status) {
    case "New":
    case "Processing":
    case "AI processed":
      return "processing";
    case "Needs review":
    case "Auto-ready":
      return "review";
    case "Approved":
    case "Synced":
      return "complete";
    case "Rejected":
    case "Sync failed":
      return "action";
    default:
      return "processing";
  }
}

export function clientFacingHint(
  status: InvoiceStatus,
  rejectionReason?: string | null,
  ocrStatus?: string | null,
): string {
  if (status === "Synced") return "Document approved and synced.";
  if (status === "Sync failed") return "Sync failed. Your accountant is following up.";
  if (status === "Rejected") {
    if (rejectionReason?.trim()) {
      return `This document was rejected because ${rejectionReason.trim().replace(/\.$/, "")}.`;
    }
    return "This document was rejected. Please check with your accountant or re-upload.";
  }
  if (status === "Approved") return "Document approved.";
  if (status === "Processing" || status === "New" || status === "AI processed") {
    return "Reading document...";
  }
  if (
    (status === "Needs review" || status === "Auto-ready") &&
    (ocrStatus === "failed" || ocrStatus === "unavailable")
  ) {
    return "We couldn't reliably read some information. Your accountant will review it.";
  }
  return CLIENT_STATUS_META[toClientStatus(status)].hint;
}

/** Status pill matching Firm StatusBadge visual language, with client-friendly labels. */
export function ClientStatusBadge({
  status,
  duplicateStatus,
  showHint = false,
  className,
}: {
  status: InvoiceStatus;
  duplicateStatus?: DuplicateStatus | null;
  showHint?: boolean;
  className?: string;
}) {
  const isDuplicate =
    duplicateStatus && duplicateStatus !== "None" && duplicateStatus !== "Not duplicate";

  const key = toClientStatus(status);
  const conf = CLIENT_STATUS_META[key];
  const Icon = isDuplicate ? AlertCircle : conf.icon;
  const label = isDuplicate
    ? "Duplicate detected"
    : status === "Synced"
      ? "Complete"
      : status === "Sync failed"
        ? "Action needed"
        : status === "Approved"
          ? "Complete"
          : conf.label;

  return (
    <div className={cn("flex flex-col gap-0.5", showHint ? "items-end" : "items-start", className)}>
      <span
        className={cn(
          "inline-flex items-center gap-1.5 rounded-full border px-2.5 py-1 text-[11px] font-medium whitespace-nowrap transition-colors duration-300",
          isDuplicate ? "bg-attention-soft text-attention border-attention/25" : conf.className,
        )}
      >
        <Icon
          size={12}
          className={key === "processing" ? "animate-spin" : undefined}
          aria-hidden="true"
        />
        {label}
      </span>
      {showHint ? (
        <span className="max-w-[11rem] text-right text-[11px] leading-snug text-muted-foreground">
          {isDuplicate
            ? "An identical document has already been uploaded."
            : clientFacingHint(status)}
        </span>
      ) : null}
    </div>
  );
}

export function clientStatusLabel(status: InvoiceStatus): string {
  return CLIENT_STATUS_META[toClientStatus(status)].label;
}
