<?php declare(strict_types=1);

namespace Modules\Fournisseur\Enums;

use Entity\Model\Paravrac;
use Entity\Model\TypeScoreFourn;
use Helpers\Trad\ITrad;

//ignore_file_trad
enum TypeScoringFrsEnum: string
{
    case BVD = 'BVD';
    case INFOLG = 'INFOLG';
    case ALTARES = 'ALTARES';
    case OXALYS_CUSTOM = 'OXALYS_CUSTOM';

    /**
     * Summary of isScorePrincipalDefined
     * @param Paravrac $paravrac
     * @return bool
     */
    public static function isScorePrincipalDefined(
        Paravrac $paravrac
    ) {
        return !empty($paravrac->getValue('PARAMFOU', 'SCORE_PRINCIPAL'));
    }

    /**
     * Summary of getTypeScorePrincipal
     *
     * Permet de pouvoir savoir quel genre de score est en score principal
     * Utile pour le conditionnement
     * @param TypeScoreFourn $typeScoreFourn
     * @param Paravrac $paravrac
     * @param ITrad $trad
     * @throws \Exception
     * @return TypeScoringFrsEnum
     */
    public static function getTypeScorePrincipal(
        TypeScoreFourn $typeScoreFourn,
        Paravrac $paravrac,
        ITrad $trad
    ): TypeScoringFrsEnum {
        $scorePrincipal = $paravrac->getValue('PARAMFOU', 'SCORE_PRINCIPAL');

        // On vérifie que le score principal est bien enregistré dans TYPE_SCORE_FOURN
        $scoreDetails = $typeScoreFourn->find(
            ['ID_TYPESCORE' => $scorePrincipal],
            ['ID_TYPESCORE']
        );
        if (empty($scoreDetails)) {
            throw new \Exception($trad->t('Le score principal n\'existe pas.'));
        }

        // Si un score partenaire est défini, on retourne sa valeur en enum
        // Si un score personnalisé existe, on retourne TypeScoringFrsEnum::OXALYS_CUSTOM
        return self::tryFrom($scorePrincipal) ?? self::OXALYS_CUSTOM;
    }

    /**
     * Summary of getDetailScorePrincipal
     *
     * Permet d'avoir le detail du score principal
     *
     * Utile pour les recherches dans les tables
     * @param TypeScoreFourn $typeScoreFourn
     * @param Paravrac $paravrac
     * @param ITrad $trad
     * @throws \Exception
     * @return ?string
     */
    public static function getIdScorePrincipal(
        TypeScoreFourn $typeScoreFourn,
        Paravrac $paravrac,
        ITrad $trad
    ): ?string {
        $scorePrincipal = $paravrac->getValue('PARAMFOU', 'SCORE_PRINCIPAL');

        // On vérifie que le score principal est bien enregistré dans TYPE_SCORE_FOURN
        $scoreDetails = $typeScoreFourn->find(
            ['ID_TYPESCORE' => $scorePrincipal],
            ['ID_TYPESCORE']
        );
        if (empty($scoreDetails)) {
            throw new \Exception($trad->t('Ce score n\'exite pas.'));
        }

        return $scoreDetails['ID_TYPESCORE'];
    }
}
