<?php

namespace Modules\Stock\Validator;

use Entity\Model\Paravrac;
use Exception;
use Helpers\Outil\Sql;
use Helpers\Trad\ITrad;
use Helpers\Trad\Trad;
use Helpers\Validator\Validator;
use Modules\Ajax\Repository\Listes;
use Modules\Stock\Repository\ArticleInventorieRepo;
use Modules\Stock\Repository\CahierInventaireRepo;
use Modules\Stock\Repository\DemandeServiceRepo;
use Modules\Stock\Repository\StockLocalRepo;
use Modules\Stock\Service\ListManagerService;
use Modules\Stock\Trait\Validator\EnteteValidatorTrait;
use Modules\Stock\Trait\Validator\ValidatorTrait;
use PDO;

class InventaireValidator extends Validator
{
    use ValidatorTrait;
    use EnteteValidatorTrait;

    /** @phpstan-ignore-next-line */
    private readonly DemandeServiceRepo $enteteRepo;
    /** @phpstan-ignore-next-line */
    private readonly Paravrac $paravrac;
    /** @phpstan-ignore-next-line */
    private readonly Listes $listes;

    public function __construct(PDO $pdo, ITrad $trad)
    {
        parent::__construct($pdo, $trad);
        $this->enteteRepo = new DemandeServiceRepo($pdo);
        $this->paravrac = new Paravrac($pdo);
        $this->listes = new Listes($pdo);
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateCodeSte(array $inventaire): self
    {
        $this->zoom(
            'Societe',
            $inventaire['CODE_STE'],
            $this->trad->t('Société'),
            $this->pdo,
            false,
            ['filter_CODE_STE' => $inventaire['CODE_STE']]
        );

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateMag(array $inventaire): self
    {
        $this->zoom(
            'Hastutil',
            $inventaire['MAG'],
            $this->trad->t('Magasinier'),
            $this->pdo,
            false,
            ['filter_CODE' => $inventaire['MAG']]
        );

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateOrdTri(array $inventaire): self
    {
        $label = $this->trad->t('Ordre de tri liste et saisie des résultats');
        $this->isObligatoire($inventaire['ORD_TRI'], $label);
        $this->contentInArray($label, $inventaire['ORD_TRI'], (new ListManagerService($this->getTrad()))->getChoixOrdreTriList());

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateCahiersInventaires(array $inventaire): self
    {
        if ((new CahierInventaireRepo($this->pdo))->countCahiersInventairesForInv($inventaire['NO_INV']) === 0) {
            $this->setError($this->trad->t('Au moins un site de stockage doit être sélectionné pour cet inventaire'));
        }

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateArticlesInventories(array $inventaire): self
    {
        if ((new ArticleInventorieRepo($this->pdo))->countArticlesInventoriesForInv($inventaire['NO_INV']) === 0) {
            $this->setError($this->trad->t('Au moins un article doit être sélectionné pour cet inventaire'));
        }

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     * @throws Exception
     */
    public function validateStocksLocaux(array $inventaire): self
    {
        $dateFermeture = Sql::toBool($inventaire['EXCL_ART']) ? $inventaire['DATEFERM']: null;
        if (empty((new StockLocalRepo($this->pdo))->findAllFromNoInv($inventaire['NO_INV'], $dateFermeture))) {
            $this->setError(Trad::strBuild($this->trad->t('Il n’existe aucun stock local correspondant aux critères de sélection de l’inventaire N° @1@'), $inventaire['NO_INV']));
        }

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateDesign(array $inventaire): self
    {
        $this->isStringAvecEspace($this->trad->t('Designation'), $inventaire['DESIGN'], 0, 255);

        return $this;
    }

    /**
     * @param array<string,mixed> $memos
     * @return $this
     */
    public function validateDescription(array $memos): self
    {
        $this->isStringAvecEspace($this->trad->t('Description'), $memos['CONTMEMO'], 0, 3000);

        return $this;
    }

    /**
     * @param array<string,mixed> $inventaire
     * @return $this
     */
    public function validateDateferm(array &$inventaire): self
    {
        $this->isDate($inventaire['DATEFERM'], '', '', true);

        return $this;
    }
}
