/**
 * Utility för att parse HTTP-responses och extrahera tydliga felmeddelanden
 */

// Deklarativ mappning av kända tekniska felsträngar → svenska meddelanden
const MESSAGE_MAP: Array<{ match: string; label: string }> = [
  { match: 'User_email_key', label: 'E-postadressen används redan av en annan användare.' },
  { match: 'Det finns redan en annan produkt med detta namn', label: 'Det finns redan en annan produkt med detta namn. Välj ett unikt namn.' },
];

function translateMessage(msg: string): string {
  const found = MESSAGE_MAP.find((entry) => msg.includes(entry.match));
  return found ? found.label : msg;
}

export async function parseErrorResponse(response: Response): Promise<string> {
  const status = response.status;

  // Läs body som text en gång — Response.body kan bara konsumeras en gång
  let bodyText = '';
  try {
    bodyText = await response.text();
  } catch {
    // Body kunde inte läsas
  }

  // Försök tolka som JSON
  try {
    const data = JSON.parse(bodyText);

    // NestJS class-validator kan returnera message som array
    if (Array.isArray(data.message) && data.message.length > 0) {
      return translateMessage(String(data.message[0]));
    }

    if (typeof data.message === 'string') {
      return translateMessage(data.message);
    }

    if (typeof data.error === 'string') {
      return translateMessage(data.error);
    }

    if (typeof data.details === 'string') {
      return translateMessage(data.details);
    }
  } catch {
    // Inte JSON — använd råtexten om den är kortfattad
    if (bodyText && bodyText.length < 200) {
      return bodyText;
    }
  }

  // Fallback baserat på HTTP-status
  const defaultMessages: Record<number, string> = {
    400: 'Ogiltiga data. Kontrollera dina inmatningar.',
    401: 'Du är inte autentiserad. Logga in.',
    403: 'Du har inte behörighet till detta.',
    404: 'Resursen hittades inte.',
    409: 'Konflikt med befintlig data.',
    422: 'Valideringen misslyckades. Kontrollera dina inmatningar.',
    500: 'Serverfel. Försök igen senare.',
    503: 'Tjänsten är inte tillgänglig.',
  };

  return defaultMessages[status] || `Fel (${status}). Försök igen senare.`;
}
