
import { toast } from "sonner";

interface ApiErrorShape {
  status?: number;
  code?: string;
  message?: string;
}

function toApiError(error: unknown): ApiErrorShape {
  return typeof error === "object" && error !== null ? error as ApiErrorShape : {};
}

export function getErrorMessage(error: unknown, fallback: string): string {
  return error instanceof Error ? error.message : toApiError(error).message ?? fallback;
}

export function getUserFacingErrorMessage(error: unknown, fallback = "Une erreur est survenue. Veuillez réessayer."): string {
  const apiError = toApiError(error);
  const message = (error instanceof Error ? error.message : apiError.message || "").toLowerCase();

  if (apiError.status === 401 || apiError.code === "PGRST301" || message.includes("jwt") || message.includes("session")) {
    return "Votre session a expiré. Reconnectez-vous pour continuer.";
  }
  if (apiError.status === 403 || apiError.code === "42501" || message.includes("permission denied") || message.includes("row-level security") || message.includes("not authorized")) {
    return "Vous n’avez pas accès à cette ressource.";
  }
  if (message.includes("failed to fetch") || message.includes("network") || message.includes("timeout")) {
    return "Le réseau semble indisponible. Vérifiez votre connexion puis réessayez.";
  }
  if (message.includes("not found") || message.includes("introuvable")) {
    return "La ressource demandée est introuvable ou n’est plus disponible.";
  }
  return fallback;
}

export function getStepMutationErrorMessage(error: unknown): string {
  const apiError = toApiError(error);
  const message = (error instanceof Error ? error.message : apiError.message || "").toLowerCase();

  if (apiError.code === "23514" && message.includes("step day must be within the trip period")) {
    return "Cette étape doit être placée pendant les dates du voyage.";
  }
  if (["22007", "22P02", "23502", "23514", "42703", "PGRST100", "PGRST102", "PGRST204"].includes(apiError.code || "")) {
    return "Certains champs de l’étape sont invalides. Vérifiez le formulaire.";
  }
  return getUserFacingErrorMessage(error, "L’étape n’a pas été ajoutée. Veuillez réessayer.");
}

export function handleApiError(error: unknown, customMessage?: string) {
  console.error("API Error:", error);
  const apiError = toApiError(error);

  toast.error(customMessage || getUserFacingErrorMessage(apiError));
}
