<?php
namespace Modules\Suivi\Controller;

use Entity\Model\OxaSuiviRequete;
use Helpers\Ariane\Ariane;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Filter\FiltreAvance\GeneratorCs;
use Helpers\Pagination\PaginatorGestion;
use Modules\Suivi\MenuContextuel\SuiviRecepContextuel;
use Modules\Suivi\Repository\SuiviCdeRepo;
use Modules\Suivi\Repository\SuiviDaRepo;
use Modules\Suivi\Repository\SuiviFacRepo;
use Modules\Suivi\Repository\SuiviRecepRepo;
use Modules\Suivi\Service\RuptureService;
use Modules\Suivi\Service\SuiviService;
use Skeleton\Controller\Controller;

class SuiviRecepController extends Controller
{
    public SuiviCdeRepo $suiviCdeRepo;
    public suiviDaRepo $suiviDaRepo;
    public suiviFacRepo $suiviFacRepo;
    public suiviRecepRepo $suiviRecepRepo;
    public SuiviService $serviceSuivi;

    /**
     * @var array<mixed> $parametrage
     */
    public $parametrage;

    public function init() : void
    {
        $this->suiviCdeRepo     = new SuiviCdeRepo($this->pdo, $this->router, $this->getTranslationService());
        $this->suiviDaRepo      = new SuiviDaRepo($this->pdo, $this->router, $this->getTranslationService());
        $this->suiviFacRepo     = new SuiviFacRepo($this->pdo, $this->router, $this->getTranslationService());
        $this->suiviRecepRepo   = new SuiviRecepRepo($this->pdo, $this->router, $this->getTranslationService());

        $this->serviceSuivi     = new SuiviService($this->pdo, $this->getTranslationService());
        $this->parametrage      = $this->serviceSuivi->getParametrageSuivi();
    }

    public function listeAction() : string
    {
        $post = $this->request->getParsedBody();
        $trad = $this->getTranslationService();

        // valeur par defaut
        if (!$post) {
            $post['filter_egal_CODE_STE']   = $_SESSION["Session_SocUsr"];

            if ($_SESSION["Session_Login"] != 'OXAUSER') {
                $post['DEM_ACH']               = $_SESSION["Session_Login"];
            }
        }

        SuiviService::loadFavorisFilter($this->pdo, $post);

        (new PaginatorGestion())->generate(0, 'BR_RECEP.NUM_BR');

        $listeRecep     = $this->suiviRecepRepo->getListe($post);

        $nombreArticle  = PaginatorGestion::getNbrArticle();
        $infopagination = PaginatorGestion::getInfoPagination();

        /** Gestion des ruptures */
        $ruptureService = new RuptureService($this->pdo);
        $listeRupture   = $ruptureService->getListeRupture($listeRecep, $post);
        
        $allRupture = [];
        foreach ($listeRupture as $kRupture => $rupture) {
            $allRupture[$kRupture] = $this->suiviRecepRepo->getListeRupture($post, $rupture)['RUPTURE_TOTAL']??0;
        }

        /** Menu contextuel */
        $menuContextuel = new SuiviRecepContextuel($this->pdo, $this->router, $this->getTranslationService());
        foreach ($listeRecep as &$recep) {
            $recep['menuContextuel'] = $menuContextuel->generate($recep, 'divRefresh', '');
        }

        $listeRequete   = (new OxaSuiviRequete($this->pdo))->fetchAll([], ['filter_egal_ID_USER' => $_SESSION['id_user'], 'filter_egal_TYPE_SUIVI' => 'RECEP']);

        $listeStatutFilter = [
            '' => '',
            'A_VALIDER'             => $trad->t('A valider'),
            'A_CONTROLER'           => $trad->t('A contrôler'),
        ];

        $listeRupture = [
            ''                      => $trad->t('Pas de rupture'),
            'CA_ENTET.CODE_FOU'     => $trad->t('Fournisseur'),
            'BR_RECEP.CODE_STE'     => $trad->t('Société'),
            'BR_RECEP.NUM_CDE'      => $trad->t('Numéro de commande'),
            
            'BR_RECEP.DATE_VAL'     => $trad->t('Date de validation'),
        ];

        $filtreAvance = new GeneratorCs($post, 'BR_RECEP', 'BR_RECEP.NUM_BR', $this->pdo, $trad);
        $filtreAvance->setFiltre('CODE_ART', 'liste', $trad->t('Article'), '', 'Ajax.liste.articles', 'Articles', null, true);
        $filtreAvance->setFiltre('BR_RECEP.DATE_VAL', 'date', $trad->t('Date de validation'), '', '', '');
        $filtreAvance->setFiltre('CA_ENTET.DTE_LIV', 'date', $trad->t('Date de livraison'), '', '', '');
        $filtreAvance->setFiltre('BR_RECEP.DATE_CRE', 'date', $trad->t('Date de création'), '', '', '');
        $filtreAvance->setFiltre('BR_RECEP.TOTAL_HT', 'numeric', $trad->t('Montant HT'));

        Ariane::generate(0, $trad->t('Suivi des receptions'), $post, $nombreArticle);

        return $this->renderer->render('@suivi/Receptions/SuiviRecep', [
            'menuActive'        => 'eproc',
            'post'              => $post,
            'source'            => 'Recep',
            'listeRecep'        => $listeRecep,

            'infoPagination'    => $infopagination,
            'parametrage'       => $this->parametrage,
            'listeStatutFilter' => $listeStatutFilter,

            'infoRupture'       => $allRupture,
            'listeRupture'      => $listeRupture,

            'initFiltreAvance'  => $filtreAvance->getInit(),
            'filtreAvance'      => $filtreAvance->getFiltres(),

            'sessionSoc'        => $_SESSION["Session_SocUsr"],
            'sessionUsr'        => $_SESSION["Session_Login"],

            'listeRequete'      => $listeRequete,
        ]);
    }

    public function ajaxDetailsAction() : string
    {
        $idDoc          = $this->request->getAttribute('idDoc');
        $source         = $this->request->getAttribute('source');
        $type         = $this->request->getAttribute('type');

        if ($type == 'A') {
            // détail d'un bon de retour
            $view = '@suivi/Receptions/ajaxDetailsRetour';
            $listeBR = $this->suiviRecepRepo->getInfoEntete($idDoc);
            $ligneRecep = $this->suiviRecepRepo->getListeLigneRetour($idDoc);
        } else {
            $view = '@suivi/Receptions/ajaxDetailsRecep';
            $listeBR = [];
            $ligneRecep = $this->suiviRecepRepo->getLiseLigne($idDoc);
        }
        
        return $this->renderer->render($view, [
            'ligneRecep'    => $ligneRecep,
            'listeBR'       => $listeBR,
            'listeCde'      => $this->suiviCdeRepo->getCdeLinkDoc('Recep', $idDoc),
            'listeDa'       => $this->suiviDaRepo->getDaLinkDoc('Recep', $idDoc),
            'listeFac'      => $this->suiviFacRepo->getFacLinkDoc('Recep', $idDoc, 'facture'),
            'listeAcompte' => $this->suiviFacRepo->getFacLinkDoc('Recep', $idDoc, 'acompte'),
            'listeAvoir'    => $this->suiviFacRepo->getFacLinkDoc('Recep', $idDoc, 'avoir'),
            'listeEtatTab'  => $this->serviceSuivi->getListeStatutCde(),
            'infoEntete'    => $this->suiviRecepRepo->getInfoEntete($idDoc),
            'source'        => $source,
            'idDoc'         => $idDoc,
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, '', 'BR_RECEP'),
            'parametrage'   => $this->parametrage,
        ]);
    }

    // PAS UTILISE POUR LE MOMENT, MAIS PEUT SERVIR PLUS TARD
    // public function ajaxDetailsLigneAction() : string
    // {
    //     $idDoc = $this->request->getAttribute('idDoc');
    //     $idLigne = $this->request->getAttribute('idLigne');

    //     return $this->renderer->render('@suivi/Receptions/ajaxDetailsLigneRecep', [
    //         'detailsLigne' => (new BrLigne($this->pdo))->find(['NUM_BR' => $idDoc, 'NO_PO' => $idLigne]),
    //         'idCS' => ChampSupp::autoCompletCodeEnr($idDoc, $idLigne, 'BR_LIGNE'),
    //     ]);
    // }
}
