<?php

namespace Traits\Validator;

use Helpers\Log\LogSysteme;
use Helpers\Trad\ITrad;
use Helpers\Trad\Trad;

trait EnumValidator
{

    abstract public function getTrad() :ITrad;
    
    /**
     * @param string $message
     */
    abstract public function setError($message) :bool;

    /**
     * @param class-string<\BackedEnum> $enumClass
     * @param mixed $value
     */
    public function isEnum(string $enumClass, &$value, string $nomChamp, bool $isObligatoire = false) : bool
    {
        // Case : invalid format
        if (! is_int($value) && ! is_string($value)) {
            $this->setError(
                Trad::strBuild(
                    $this->getTrad()->t('La valeur "@1@" pour le champ @2@ n\'est pas autorisée.'),
                    $value,
                    $nomChamp
                )
            );
            LogSysteme::prefixErrorLog((string) new \Exception('Invalid value type "'.var_export($value, true).'"'));
            $value = null;
            return false;
        }

        $enum = $enumClass::tryFrom($value);

        // Case : invalid value
        if ($enum == null) {
            if ($isObligatoire) {
                $this->setError(
                    Trad::strBuild(
                        $this->getTrad()->t('Le champ @1@ est obligatoire.'),
                        $nomChamp
                    )
                );
                return false;
            }
            $value = null;
            return true;
        }
        
        $value = $enum;
        return true;
    }

    /**
     * @param class-string<\BackedEnum> $enumClass
     * @param mixed $value
     */
    public function isEnumRaw(string $enumClass, &$value, string $nomChamp, bool $isObligatoire = false) : bool
    {
        $res = $this->isEnum($enumClass, $value, $nomChamp, $isObligatoire);
        if ($value) {
            // Return the scalar value of the enum instead of the enum
            $value = $value->value;
        }
        return $res;
    }
}
