<?php

namespace Modules\Delegation\Validator;

use Entity\Model\WfDelEnt;
use Helpers\Trad\Trad;
use Helpers\Validator\Validator;
use Modules\Delegation\Service\PermanentDelegationService;

class PermanentDelegationValidator extends Validator
{
    /**
     * validateAbsenceDelegation
     *
     * @param  array<mixed> $post
     * @param  string $deleg
     * @param  string $societe
     * @return bool
     */
    public function validatePermanentDelegation(array &$post, string $deleg = '', string $societe = ''): bool
    {
        // on contrôle que le délégataire est renseigné
        $this->delegataireZoom(($post['CODE_DEL'] ?? ''), $this->trad->t('Délégataires'), $this->pdo);

        // si elle est renseignée, on contrôle que la société est bien présente dans la liste des sociétés communes au signataire et délégataire
        if (isset($post['TTE_STE']) && $post['TTE_STE'] != 'on') {
            $this->societeCommuneZoom($post['DELEG'], $this->trad->t('Sociétés communes'), $this->pdo);
        }

        // contrôle montant plafond renseigné
        if (isset($post['MONTANT'])) {
            $this->isFloat($this->trad->t('Montant plafond'), $post['MONTANT'], '13.2', true, '999999999.99');
        }

        //contrôle délégation n'existe pas déjà si on n'est pas en modif
        if ($deleg == '') {
            if (isset((new WfDelEnt($this->pdo))->find([
                'CODE_SIGN' => $_SESSION['Session_Login'],
                'CODE_DEL' => $post['CODE_DEL'],
                'CODE_STE' => $post['CODE_STE'] ?? '',
            ])['CODE_DEL'])) {
                $this->setError($this->trad->t('Cette délégation existe déjà.'));
            }
        }

        // on contrôle que les déclencheurs sont correctement renseignés et qu'il n'en existe qu'un par code table
        $service = new PermanentDelegationService($this->pdo, $this->trad);
        $codesTable = [];

        foreach ($post as $key => $value) {
            if (strpos($key, 'CODE_TABLE') === 0) {
                $id = substr($key, -1);
                $zoomInfo = $service->getZoomInputInfo($value, (int)$id);
                $this->zoom($zoomInfo['entity'], $post['CODE_ENREG' . $id], Trad::strBuild(
                    $this->trad->t('Déclencheurs de type @1@'),
                    $value
                ), $this->pdo);
                if (in_array($value, $codesTable)) {
                    $this->setError(Trad::strBuild(
                        $this->trad->t('Il ne peut y avoir plusieurs déclencheurs du même type. Valeur en double : @1@'),
                        $value
                    ));
                }
                $codesTable[] = $value;
            }
        }

        return $this->isValid();
    }
}
