<?php

namespace App\Support;

class ApiErrorTranslator
{
    /**
     * @var array<string, string>
     */
    private static array $explanations = [
        'search terms are required' => 'Le champ de recherche est obligatoire.',
        'invalid api key' => 'La cle API configuree est invalide ou absente.',
        'api key is required' => 'La cle API est requise dans les en-tetes de la requete.',
        'not found' => "L'element demande n'a pas ete trouve dans la base de donnees.",
        'layout not found' => 'La valeur du parametre LAYOUT est inconnue ou invalide.',
        'unknown stkid' => "L'identifiant de stock (STKID) fourni est inconnu.",
        'invalid date' => 'Le format de date fourni est invalide.',
        'thirdid is required' => "L'identifiant du tiers est obligatoire.",
        'jnl is required' => 'Le code journal est obligatoire.',
        'number is required' => 'Le numero de document est obligatoire.',
        'artid is required' => "L'identifiant de l'article est obligatoire.",
    ];

    /**
     * Normalise et traduit un message d'erreur API.
     *
     * Le champ `error` de l'API peut etre null, une chaine ou un tableau.
     */
    public static function translate(mixed $error): ?string
    {
        if ($error === null) {
            return null;
        }

        $message = self::normalize($error);

        if ($message === '') {
            return null;
        }

        $explanation = self::findExplanation($message);

        if ($explanation !== null) {
            return "{$message}\n\nExplication : {$explanation}";
        }

        return $message;
    }

    /**
     * Normalise une valeur error (string ou array) en chaine lisible.
     */
    public static function normalize(mixed $error): string
    {
        if (is_array($error)) {
            return implode(' ', array_map('strval', $error));
        }

        return (string) $error;
    }

    private static function findExplanation(string $message): ?string
    {
        $lower = mb_strtolower($message);

        foreach (self::$explanations as $pattern => $explanation) {
            if (str_contains($lower, $pattern)) {
                return $explanation;
            }
        }

        return null;
    }
}
