"use client";

import { Badge } from "@/components/ui/badge";
import { cn } from "@/lib/utils";
import { AccountStatus, TransactionStatus, TransferStatus } from "@/types/banking";

interface StatusBadgeProps {
  readonly status: AccountStatus | TransactionStatus | TransferStatus;
  readonly variant?: "account" | "transaction" | "transfer";
  readonly size?: "sm" | "md" | "lg";
  readonly className?: string;
}

const accountStatusConfig = {
  active: {
    label: "Actif",
    color: "bg-green-100 text-green-700 border-green-200",
    icon: "🟢",
  },
  frozen: {
    label: "Gelé",
    color: "bg-blue-100 text-blue-700 border-blue-200",
    icon: "🔵",
  },
  closed: {
    label: "Fermé",
    color: "bg-red-100 text-red-700 border-red-200",
    icon: "🔴",
  },
};

const transactionStatusConfig = {
  pending: {
    label: "En attente",
    color: "bg-yellow-100 text-yellow-700 border-yellow-200",
    icon: "🟡",
  },
  completed: {
    label: "Terminé",
    color: "bg-green-100 text-green-700 border-green-200",
    icon: "✅",
  },
  failed: {
    label: "Échoué",
    color: "bg-red-100 text-red-700 border-red-200",
    icon: "❌",
  },
  cancelled: {
    label: "Annulé",
    color: "bg-gray-100 text-gray-700 border-gray-200",
    icon: "⚫",
  },
};

const transferStatusConfig = {
  pending: {
    label: "En attente",
    color: "bg-yellow-100 text-yellow-700 border-yellow-200",
    icon: "⏳",
  },
  processing: {
    label: "En cours",
    color: "bg-blue-100 text-blue-700 border-blue-200",
    icon: "🔄",
  },
  completed: {
    label: "Terminé",
    color: "bg-green-100 text-green-700 border-green-200",
    icon: "✅",
  },
  failed: {
    label: "Échoué",
    color: "bg-red-100 text-red-700 border-red-200",
    icon: "❌",
  },
  cancelled: {
    label: "Annulé",
    color: "bg-gray-100 text-gray-700 border-gray-200",
    icon: "🚫",
  },
  scheduled: {
    label: "Programmé",
    color: "bg-purple-100 text-purple-700 border-purple-200",
    icon: "📅",
  },
};

const sizeStyles = {
  sm: "text-xs px-2 py-1",
  md: "text-sm px-2.5 py-1.5",
  lg: "text-base px-3 py-2",
};

export function StatusBadge({ status, variant = "account", size = "sm", className }: StatusBadgeProps) {
  // Safe property access using switch statements to avoid Object Injection Sink warnings
  const getConfig = () => {
    switch (variant) {
      case "transaction": {
        const transactionStatus = status as TransactionStatus;
        switch (transactionStatus) {
          case "pending":
            return transactionStatusConfig.pending;
          case "completed":
            return transactionStatusConfig.completed;
          case "failed":
            return transactionStatusConfig.failed;
          case "cancelled":
            return transactionStatusConfig.cancelled;
          default:
            return null;
        }
      }
      case "transfer": {
        const transferStatus = status as TransferStatus;
        switch (transferStatus) {
          case "pending":
            return transferStatusConfig.pending;
          case "processing":
            return transferStatusConfig.processing;
          case "completed":
            return transferStatusConfig.completed;
          case "failed":
            return transferStatusConfig.failed;
          case "cancelled":
            return transferStatusConfig.cancelled;
          case "scheduled":
            return transferStatusConfig.scheduled;
          default:
            return null;
        }
      }
      default: {
        const accountStatus = status as AccountStatus;
        switch (accountStatus) {
          case "active":
            return accountStatusConfig.active;
          case "frozen":
            return accountStatusConfig.frozen;
          case "closed":
            return accountStatusConfig.closed;
          default:
            return null;
        }
      }
    }
  };

  // Safe size style access using switch statement
  const getSizeStyle = () => {
    switch (size) {
      case "sm":
        return sizeStyles.sm;
      case "md":
        return sizeStyles.md;
      case "lg":
        return sizeStyles.lg;
      default:
        return sizeStyles.sm;
    }
  };

  const config = getConfig();
  const sizeStyle = getSizeStyle();

  if (!config) {
    return (
      <Badge variant="outline" className={cn(sizeStyle, className)}>
        {status}
      </Badge>
    );
  }

  return (
    <Badge variant="outline" className={cn(sizeStyle, config.color, "font-medium", className)}>
      <span className="mr-1">{config.icon}</span>
      {config.label}
    </Badge>
  );
}
