import axios from 'axios';

/** Forme d'une réponse d'erreur Laravel : message métier et/ou erreurs de validation. */
interface LaravelErrorData {
  message?: string;
  errors?: Record<string, string[]>;
}

function errorData(err: unknown): LaravelErrorData | undefined {
  if (axios.isAxiosError(err)) return err.response?.data as LaravelErrorData | undefined;
  // Repli défensif pour les erreurs non-axios qui portent quand même une réponse.
  return (err as { response?: { data?: LaravelErrorData } })?.response?.data;
}

/**
 * Extrait un message lisible d'une erreur API : 1ʳᵉ erreur de validation Laravel
 * ({ errors: { champ: [msg] } }) ou message du contrôleur (RuntimeException →
 * { message }). Repli sur `fallback` (déjà traduit) si rien d'exploitable.
 *
 * Le résultat est destiné à être affiché tel quel : ne pas le passer à `t()`,
 * car un message backend peut contenir des `.`/`:` que i18next interprète.
 */
export function apiErrorMessage(err: unknown, fallback: string): string {
  const data = errorData(err);
  if (data?.errors) {
    const first = Object.values(data.errors)[0];
    if (Array.isArray(first) && first[0]) return first[0];
  }
  if (data?.message) return data.message;
  return fallback;
}

/**
 * Transforme la réponse de validation Laravel (422) en erreurs par champ Formik.
 * Les clés serveur sont préfixées (`device.imei`, `device.sim_card.iccid`) alors
 * que le formulaire utilise des champs plats : on ne garde que le dernier segment.
 */
export function extractValidationErrors(err: unknown): Record<string, string> | null {
  if (!axios.isAxiosError(err) || err.response?.status !== 422) return null;
  const errors = err.response.data?.errors as Record<string, string[]> | undefined;
  if (!errors) return null;

  const fieldErrors: Record<string, string> = {};
  for (const [key, messages] of Object.entries(errors)) {
    const field = key.split('.').pop() ?? key;
    if (messages?.length) fieldErrors[field] = messages[0];
  }
  return Object.keys(fieldErrors).length ? fieldErrors : null;
}
