<?php
namespace Modules\Suivi\Controller;

use Entity\Model\DaLigne;
use Entity\Model\OxaSuiviRequete;
use Helpers\Ariane\Ariane;
use Helpers\ChampsSupplementaire\ChampSupp;
use Helpers\Filter\FiltreAvance\GeneratorCs;
use Helpers\Pagination\PaginatorGestion;
use Modules\DemandeAchat\Outil\FormArray;
use Modules\GlobalApplication\Repository\LicenceOxalys;
use Modules\Suivi\MenuContextuel\SuiviDaContextuel;
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 SuiviDaController 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();

        // valeur par defaut
        if (!$post) {
            $post['filter_egal_CODE_STE']   = $_SESSION["Session_SocUsr"];
            if ($_SESSION["Session_Login"] != 'OXAUSER' && $this->parametrage['FILTDDA']) {
                $post['filter_egal_NO_DEM']     = $_SESSION["Session_Login"];
            }
        }

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

        (new PaginatorGestion())->generate(0, 'DA_ENTET.NO_DA');

        $listeDA = $this->suiviDaRepo->getListe($post);

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

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

        /** Menu contextuel */
        $menuContextuel = new SuiviDaContextuel($this->pdo, $this->router, $this->getTranslationService());
        foreach ($listeDA as &$da) {
            $da['menuContextuel'] = $menuContextuel->generate($da, 'divRefresh', '');
        }
        
        $listeRequete = (new OxaSuiviRequete($this->pdo))->fetchAll([], ['filter_egal_ID_USER' => $_SESSION['id_user'], 'filter_egal_TYPE_SUIVI' => 'DA']);

        $listeStatutFilter = FormArray::listEtatDa($trad);

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

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

        $filtreAvance = new GeneratorCs($post, 'DA_ENTET', 'DA_ENTET.NO_DA', $this->pdo, $trad);
        $filtreAvance->setFiltre('DA_LIGNE.CODE_ART', 'liste', $trad->t('Article'), '', 'Ajax.liste.articles', 'Articles', null);
        $filtreAvance->setFiltre('DA_ENTET.DTE_EMISS', 'date', $trad->t('Date d\'émission'), '', '', '');
        $filtreAvance->setFiltre('DA_ENTET.DTE_VAL', 'date', $trad->t('Date de validation'), '', '', '');
        $filtreAvance->setFiltre('DA_ENTET.DTE_LIV', 'date', $trad->t('Date de livraison'), '', '', '');
        $filtreAvance->setFiltre('DA_ENTET.TOTAL_DA', 'numeric', $trad->t('Montant HT'));
        $filtreAvance->setFiltre('COD_TAC', 'liste', $trad->t('Type d\'achat'), '', 'Ajax.liste.typeAchat', 'TypeAchat', null, true);
        $filtreAvance->setFiltre('DA_ENTET.TYP_DOC', 'liste', $trad->t('Type de document'), '', 'Ajax.liste.typeDoc', 'TypeDoc');

        Ariane::generate(0, $trad->t('Suivi des demandes d\'achat'), $post, $nombreArticle);
        
        return $this->renderer->render('@suivi/DemandesAchats/SuiviDa', [
            'menuActive'        => 'eproc',
            'post'              => $post,
            'source'            => 'DA',
            'listeDa'           => $listeDA,
            '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,
            'isTermPaieActive' => $licenceOxalys->termPaieActive(),
        ]);
    }

    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/DemandesAchats/ajaxDetailsDa', [
            'ligneDa'       => $this->suiviDaRepo->getLiseLigne($idDoc),
            'context'       => $context,
            'signataire'    => $signataire,

            'listeCde'      => $this->suiviCdeRepo->getCdeLinkDoc('DA', $idDoc),
            'listeRecep'    => $this->suiviRecepRepo->getRecepLinkDoc('DA', $idDoc),
            'listeFac'      => $this->suiviFacRepo->getFacLinkDoc('DA', $idDoc, 'facture'),
            'listeAcompte' => $this->suiviFacRepo->getFacLinkDoc('DA', $idDoc, 'acompte'),
            'listeAvoir'    => $this->suiviFacRepo->getFacLinkDoc('DA', $idDoc, 'avoir'),
            'listeConsult'  => $this->suiviConsultRepo->getConsultLinkDoc('DA', $idDoc),
            'listeEtatTab'  => $this->serviceSuivi->getListeStatutCde(),
            'infoEntete'    => $this->suiviDaRepo->getInfoEntete($idDoc),
            'source'        => $source,
            'idDoc'         => $idDoc,
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, '', 'DA_ENTET'),
            'parametrage'   => $this->parametrage,
        ]);
    }

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

        return $this->renderer->render('@suivi/DemandesAchats/ajaxDetailsLigneDa', [
            'detailsLigne'  => (new DaLigne($this->pdo))->find(['NO_DA' => $idDoc, 'NO_PO' => $idLigne]),
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, $idLigne, 'DA_LIGNE'),
            'parametrage'   => $this->parametrage,
            'idDoc'         => $idDoc,
            'idLigne'       => $idLigne,
        ]);
    }
}
