<?php
namespace Modules\Suivi\Controller;

use Entity\Model\CaLigne;
use Entity\Model\OxaSuiviRequete;
use Helpers\Ariane\Ariane;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Filter\FiltreAvance\GeneratorCs;
use Helpers\Outil\Sql;
use Helpers\Pagination\PaginatorGestion;
use Helpers\Session\Session;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Modules\Suivi\MenuContextuel\SuiviCdeContextuel;
use Modules\Suivi\Repository\SuiviCdeRepo;
use Modules\Suivi\Repository\SuiviConsultRepo;
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 SuiviCdeController extends Controller
{
    public SuiviCdeRepo $suiviCdeRepo;
    public suiviDaRepo $suiviDaRepo;
    public suiviFacRepo $suiviFacRepo;
    public suiviRecepRepo $suiviRecepRepo;
    public SuiviConsultRepo $suiviConsultRepo;
    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->suiviConsultRepo = new SuiviConsultRepo($this->pdo, $this->router, $this->getTranslationService());
        
        $this->serviceSuivi     = new SuiviService($this->pdo, $this->getTranslationService());
        $this->parametrage      = $this->serviceSuivi->getParametrageSuivi();
    }

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

        $trad       = $this->getTranslationService();
        $typeSuivi  = $this->request->getAttribute('context');

        if (!$typeSuivi) {
            $typeSuivi = 'CDE';
        }

        if ($typeSuivi == 'CdeToRate') {
            $titreAriane    = $trad->t('Mes commandes à noter');
        } elseif ($typeSuivi == 'SCdeToRate') {
            $titreAriane    = $trad->t('Suivi notations commandes');
        } else {
            $titreAriane    = $trad->t('Suivi des commandes');
        }
        
        // valeur par defaut
        if (!$post) {
            $post['filter_egal_CODE_STE']   = $_SESSION["Session_SocUsr"];
            if ($_SESSION["Session_Login"] != 'OXAUSER' && $this->parametrage['FILT_CDE']) {
                $post['ACH']                = $_SESSION["Session_Login"];
            }
        }

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

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

        // TODO: DA_CDE should be validated as int
        
        (new PaginatorGestion())->generate(0, 'CA_ENTET.NO_CDE');

        $listeCde = $this->suiviCdeRepo->getListe($post, $typeSuivi);

        /** Pagination */
        $nombreArticle  = PaginatorGestion::getNbrArticle();
        $infopagination = PaginatorGestion::getInfoPagination();
        
        /** Gestion des ruptures */
        $ruptureService = new RuptureService($this->pdo);
        $listeRupture   = $ruptureService->getListeRupture($listeCde, $post);
        
        $allRupture = [];
        foreach ($listeRupture as $kRupture => $rupture) {
            $allRupture[$kRupture] = $this->suiviCdeRepo->getRupture($post, $rupture)['RUPTURE_TOTAL']??0;
        }
        
        /** Menu contextuel */
        $menuContextuel = new SuiviCdeContextuel($this->pdo, $this->router, $this->getTranslationService());
        
        foreach ($listeCde as &$cde) {
            if ($typeSuivi == 'CdeToRate' || $typeSuivi == 'SCdeToRate') {
                $cde['menuContextuel'] = $menuContextuel->generateNotation($typeSuivi, $cde);
            } else {
                $cde['menuContextuel'] = $menuContextuel->generate($cde, 'suivi', '');
            }
            $cde['SUIVI_TERME_PAIEMENT'] = (($cde['ETAT_CDE'] == 'E' && Sql::toBool($cde['SIGNEE']) && !Sql::toBool($cde['REFUSEE'])) || $cde['ETAT_CDE'] == 'S') && ($cde['TOT_CDE'] != 0) && ($cde['TP_EXIST'] == 1);
        }

        Ariane::generate(0, $titreAriane, $post, $nombreArticle);
        
        /** Init des valeurs de l'écran */
        $listeSoussTraitance = [
            ''                       => $trad->t('Toutes'),
            'SANS_ST'                => $trad->t('Sans Sous-traitance'),
            'AVEC_ST'                => $trad->t('Avec Sous-traitance'),
            'SANS_CONTRAT'           => $trad->t('Sans contrat généré'),
            'AVEC_CONTRAT'           => $trad->t('Avec contrat généré'),
            'CONTRAT_NON_RECEP'      => $trad->t('Avec contrat non réceptionné'),
            'CONTRAT_RECEP'          => $trad->t('Avec contrat réceptionné'),
        ];

        $listeRupture = [
            ''                      => $trad->t('Pas de rupture'),
            'CA_ENTET.CODE_FOU'     => $trad->t('Fournisseur'),
            'CA_ENTET.ACH'          => $trad->t('Acheteur'),
            'CA_ENTET.CODE_STE'     => $trad->t('Société'),

            'CA_ENTET.SECTIMP'      => $trad->t('Section d\'imputation'),
            'CA_ENTET.CODECOMP'     => $trad->t('Code complémentaire'),
            'CA_ENTET.SSCPTEANA'    => $trad->t('Sous comptes d\'analyse'),
            
            'CA_ENTET.DTE_LIV'      => $trad->t('Date de livraison'),
            'CA_ENTET.DTE_VALID'    => $trad->t('Date de validation'),
        ];

        // $filtreAvance = new Generator($post);
        $filtreAvance = new GeneratorCs($post, 'CA_ENTET', 'CA_ENTET.NO_CDE', $this->pdo, $trad);
        // $filtreAvance->setFiltre('COD_ART', 'liste', $trad->t('Article'), '', 'Ajax.liste.articles', 'Articles', null, true);
        $filtreAvance->setFiltre('CA_LIGNE.CODE_ART', 'liste', $trad->t('Article'), '', 'Ajax.liste.articles', 'Articles');
        $filtreAvance->setFiltre('CA_ENTET.DTE_AR', 'date', $trad->t('Date d\'AR'), '', '', '');
        $filtreAvance->setFiltre('CA_ENTET.DTE_VALID', 'date', $trad->t('Date de validation'), '', '', '');
        $filtreAvance->setFiltre('CA_ENTET.DTE_LIV', 'date', $trad->t('Date de livraison'), '', '', '');
        $filtreAvance->setFiltre('CA_ENTET.TOT_TTC', 'numeric', $trad->t('Montant TTC'));
        $filtreAvance->setFiltre('CA_ENTET.TOT_CDE', 'numeric', $trad->t('Montant HT'));
        $filtreAvance->setFiltre('CA_ENTET.COD_TAC', 'liste', $trad->t('Type d\'achat'), '', 'Ajax.liste.typeAchat', 'TypeAchat');
        $filtreAvance->setFiltre('CA_ENTET.TYP_DOC', 'liste', $trad->t('Type de document'), '', 'Ajax.liste.typeDoc', 'TypeDoc');
        $filtreAvance->setFiltre('CA_ENTET.REFOFFOU', 'text', $trad->t('Référence offre fournisseur')); //302167
        
        return $this->renderer->render('@suivi/Commandes/SuiviCde', [
            'menuLeft'              => $typeSuivi!='CDE'? $typeSuivi:null,
            'menuActive'            => 'eproc',
            'post'                  => $post,
            'source'                => 'CDE',
            'listeCde'              => $listeCde,
            'infoPagination'        => $infopagination,
            'listeEtatTab'          => $this->serviceSuivi->getListeStatutCde(),
            'parametrage'           => $this->parametrage,
            'infoRupture'           => $allRupture,
            'listeStatutFilter'     => $this->serviceSuivi->getListeStatutFilterCde(),
            'listeSoussTraitance'   => $listeSoussTraitance,
            'listeRupture'          => $listeRupture,

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

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

            'listeRequete'          => $listeRequete,
            'typeSuivi'             => $typeSuivi,

            'isTermPaieActive'      => $licenceOxalys->termPaieActive(),
        ]);
    }

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

        (new PaginatorGestion())->generate(0, 'CA_ENTET.NO_CDE');

        $listeCde       = $this->suiviCdeRepo->getListeSend($post);

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

        Ariane::generate(0, $trad->t('Commande(s) à envoyer'), $post, $nombreArticle);

        
        /** Menu contextuel */
        $menuContextuel = new SuiviCdeContextuel($this->pdo, $this->router, $this->getTranslationService());
        
        foreach ($listeCde as &$cde) {
            $cde['menuContextuel'] = $menuContextuel->generate($cde, 'suivi', '');
        }

        return $this->renderer->render('@suivi/Commandes/SuiviCde', [
            'post'              => $post,
            'menuActive'        => 'eproc',
            'source'            => 'CDE',
            'listeCde'          => $listeCde,
            'infoPagination'    => $infopagination,
            'listeEtatTab'      => $this->serviceSuivi->getListeStatutCde(),
            'listeStatutFilter' => $this->serviceSuivi->getListeStatutFilterCde(),
            'parametrage'       => $this->parametrage,
            'context'           => 'send',
        ]);
    }

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

        return $this->renderer->render('@suivi/Commandes/ajaxDetailsCde', [
            'context'       => $context,
            'signataire'    => $signataire,

            'ligneCde'      => $this->suiviCdeRepo->getLiseLigne($idDoc),
            'listeDa'       => $this->suiviDaRepo->getDaLinkDoc('CDE', $idDoc),
            'listeRecep'    => $this->suiviRecepRepo->getRecepLinkDoc('CDE', $idDoc),
            'listeFac'      => $this->suiviFacRepo->getFacLinkDoc('CDE', $idDoc, 'facture'),
            'listeAcompte' => $this->suiviFacRepo->getFacLinkDoc('CDE', $idDoc, 'acompte'),
            'listeAvoir'    => $this->suiviFacRepo->getFacLinkDoc('CDE', $idDoc, 'avoir'),
            'listeConsult'  => $this->suiviConsultRepo->getConsultLinkDoc('CDE', $idDoc),
            'infoEntete'    => $this->suiviCdeRepo->getInfoEntete($idDoc),
            'source'        => $source,
            'idDoc'         => $idDoc,
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, '', 'CA_ENTET'),
            'parametrage'   => $this->parametrage,
        ]);
    }

    public function ajaxDetailsLigneAction() : string
    {
        $idDoc      = $this->request->getAttribute('idDoc');
        $idLigne    = $this->request->getAttribute('idLigne');

        return $this->renderer->render('@suivi/Commandes/ajaxDetailsLigneCde', [
            'detailsLigne'  => (new CaLigne($this->pdo))->find(['NO_CDE' => $idDoc, 'NO_PO' => $idLigne]),
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, $idLigne, 'CA_LIGNE'),
            'parametrage'   => $this->parametrage,
            'idDoc'         => $idDoc,
            'idLigne'       => $idLigne,
        ]);
    }
}
