import React from "react";
import { AttendanceCode, SessionStatus } from "@/types/attendance";
import { SubstitutionStatus, RequestStatus } from "@/types/adjustment";
import { cn } from "@/lib/utils";

type BadgeType =
  | AttendanceCode
  | SessionStatus
  | SubstitutionStatus
  | RequestStatus
  | "SAFE"
  | "WARNING"
  | "CRITICAL"
  | "SHORTAGE";

interface StatusBadgeProps {
  status?: BadgeType | string;
  code?: AttendanceCode | string;
  size?: "sm" | "md" | "lg";
  className?: string;
  conductedHours?: number; // e.g. displays "P (4)"
}

export function StatusBadge({
  status,
  code,
  size = "md",
  className,
  conductedHours,
}: StatusBadgeProps) {
  const effectiveStatus = (status || code || "P") as string;
  const sizeClasses = {
    sm: "px-1.5 py-0.5 text-[11px] leading-tight font-medium",
    md: "px-2 py-0.5 text-xs font-medium",
    lg: "px-2.5 py-1 text-sm font-semibold",
  };

  const getBadgeConfig = (val: string): { label: string; styles: string } => {
    switch (val) {
      // Raw Attendance Marks
      case "P":
        return {
          label: conductedHours ? `P (${conductedHours})` : "Present",
          styles: "bg-emerald-50 text-emerald-700 border-emerald-200 dark:bg-emerald-950/40 dark:text-emerald-300 dark:border-emerald-800",
        };
      case "A":
        return {
          label: conductedHours ? `A (${conductedHours})` : "Absent",
          styles: "bg-rose-50 text-rose-700 border-rose-200 dark:bg-rose-950/40 dark:text-rose-300 dark:border-rose-800",
        };
      case "C":
        return {
          label: conductedHours ? `C (${conductedHours})` : "Condoned",
          styles: "bg-amber-50 text-amber-700 border-amber-200 dark:bg-amber-950/40 dark:text-amber-300 dark:border-amber-800",
        };
      case "H":
        return {
          label: "Holiday",
          styles: "bg-slate-100 text-slate-700 border-slate-200 dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700",
        };

      // Session Lifecycle States
      case "SCHEDULED":
        return {
          label: "Scheduled",
          styles: "bg-slate-100 text-slate-700 border-slate-200 dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700",
        };
      case "OPEN":
        return {
          label: "Open",
          styles: "bg-blue-50 text-blue-700 border-blue-200 dark:bg-blue-950/40 dark:text-blue-300 dark:border-blue-800",
        };
      case "DRAFT":
        return {
          label: "Draft",
          styles: "bg-amber-50 text-amber-700 border-amber-200 dark:bg-amber-950/40 dark:text-amber-300 dark:border-amber-800",
        };
      case "FINALIZED":
        return {
          label: "Finalized",
          styles: "bg-emerald-50 text-emerald-700 border-emerald-200 dark:bg-emerald-950/40 dark:text-emerald-300 dark:border-emerald-800",
        };
      case "LOCKED":
        return {
          label: "Locked",
          styles: "bg-slate-200 text-slate-800 border-slate-300 dark:bg-slate-700 dark:text-slate-200 dark:border-slate-600",
        };
      case "CANCELLED":
        return {
          label: "Cancelled",
          styles: "bg-rose-50 text-rose-700 border-rose-200 dark:bg-rose-950/40 dark:text-rose-300 dark:border-rose-800",
        };
      case "RESCHEDULED":
        return {
          label: "Rescheduled",
          styles: "bg-purple-50 text-purple-700 border-purple-200 dark:bg-purple-950/40 dark:text-purple-300 dark:border-purple-800",
        };

      // Approval States
      case "PENDING":
        return {
          label: "Pending Review",
          styles: "bg-amber-50 text-amber-700 border-amber-200 dark:bg-amber-950/40 dark:text-amber-300 dark:border-amber-800",
        };
      case "APPROVED":
        return {
          label: "Approved",
          styles: "bg-emerald-50 text-emerald-700 border-emerald-200 dark:bg-emerald-950/40 dark:text-emerald-300 dark:border-emerald-800",
        };
      case "REJECTED":
        return {
          label: "Rejected",
          styles: "bg-rose-50 text-rose-700 border-rose-200 dark:bg-rose-950/40 dark:text-rose-300 dark:border-rose-800",
        };

      // Defaulter Policy Tiers
      case "SAFE":
        return {
          label: "On Track",
          styles: "bg-emerald-50 text-emerald-700 border-emerald-200 dark:bg-emerald-950/40 dark:text-emerald-300 dark:border-emerald-800",
        };
      case "WARNING":
        return {
          label: "Warning",
          styles: "bg-amber-50 text-amber-700 border-amber-200 dark:bg-amber-950/40 dark:text-amber-300 dark:border-amber-800",
        };
      case "CRITICAL":
        return {
          label: "Critical Shortage",
          styles: "bg-orange-50 text-orange-700 border-orange-200 dark:bg-orange-950/40 dark:text-orange-300 dark:border-orange-800",
        };
      case "SHORTAGE":
        return {
          label: "Debarment Risk",
          styles: "bg-rose-50 text-rose-700 border-rose-200 dark:bg-rose-950/40 dark:text-rose-300 dark:border-rose-800",
        };

      default:
        return {
          label: val,
          styles: "bg-slate-100 text-slate-700 border-slate-200 dark:bg-slate-800 dark:text-slate-300 dark:border-slate-700",
        };
    }
  };

  const { label, styles } = getBadgeConfig(effectiveStatus);

  return (
    <span
      className={cn(
        "inline-flex items-center justify-center rounded-full border whitespace-nowrap tracking-tight transition-colors font-medium",
        sizeClasses[size],
        styles,
        className
      )}
    >
      {label}
    </span>
  );
}
