<?php
namespace Modules\Suivi\Controller;

use Entity\Model\Codgest;
use Entity\Model\FacLig;
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\SuiviFacContextuel;
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 SuiviFacController 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) {
            if ($_SESSION["Session_Login"] != 'OXAUSER') {
                $post['ACH']                    = $_SESSION["Session_Login"];
            }
            $post['filter_egal_CODE_STE']   = $_SESSION["Session_SocUsr"];
            $post['ARCHIVEES']              = true;
        }

        SuiviService::loadFavorisFilter($this->pdo, $post);
        
        $listeRequete = (new OxaSuiviRequete($this->pdo))->fetchAll([], ['filter_egal_ID_USER' => $_SESSION['id_user'], 'filter_egal_TYPE_SUIVI' => 'BAP']);

        (new PaginatorGestion())->generate(0, 'FAC_ENT.NUM_FACT');

        $listeFac = $this->suiviFacRepo->getListe($post);

        foreach ($listeFac as &$fac) {
            $ecartLigne = $this->serviceSuivi->getValeursEcartLigneFac($this->suiviFacRepo, $fac['NUM_FACT']);
            $fac = array_merge($fac, $ecartLigne);
        }

        /** Gestion des ruptures */
        $ruptureService     = new RuptureService($this->pdo);
        $listeRupture       = $ruptureService->getListeRupture($listeFac, $post);

        $allRupture = [];
        foreach ($listeRupture as $kRupture => $rupture) {
            $allRupture[$kRupture] = $this->suiviFacRepo->getListe($post, $rupture)['RUPTURE_TOTAL']??0;
        }

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

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

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

        $listeType = ['F' => $trad->t('Fac'), 'A' => $trad->t('Avr'), 'C' => $trad->t('Acp')];

        $listeReglement = [
            ''                      => '',
            'NON'                   => $trad->t('Aucun règlement'),
            'NONPART'               => $trad->t('Aucun règlement ou règlement partiel'),
            'PART'                  => $trad->t('Règlement partiel'),
            'TOTAL'                 => $trad->t('Règlement total'),
        ];

        $listeStatut = [
            ''                      => '',
            'AFF_A_SAIS'            => $trad->t('Affectation à saisir'),
            'PRE_AFF'               => $trad->t('Factures en pré-affectation'),
            'AFFECT_VALID'          => $trad->t('Affectation à valider'),
            'ATTENTE_BAP'           => $trad->t('Attente du Bon à Payer'),
            'FAC_LITIG'             => $trad->t('Factures en litige'),
            'SIGNEES'               => $trad->t('Signées'),
            'REFUSEES'              => $trad->t('Refusées'),
            'NON_REGL'              => $trad->t('Non Règlées'),
            'PART_REGL'             => $trad->t('Partiellement Règlées'),
            'TOT_REGL'              => $trad->t('Totalement Règlées'),
        ];

        $listeLitige = [
            ''                      => $trad->t('Toute'),
            'T'                     => $trad->t('Avec'),
            'F'                     => $trad->t('Sans'),
        ];

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

        $filtreAvance = new GeneratorCs($post, 'FAC_ENT', 'FAC_ENT.NUM_FACT', $this->pdo, $trad);
        $filtreAvance->setFiltre('FAC_ENT.DATE_ENR', 'date', $trad->t('Date d\'enregistrement'), '', '', '');
        $filtreAvance->setFiltre('FAC_ENT.TOTAL_TTC', 'numeric', $trad->t('Montant TTC'));
        $filtreAvance->setFiltre('FAC_ENT.TOTAL_HT', 'numeric', $trad->t('Montant HT'));


        return $this->renderer->render('@suivi/Factures/SuiviFac', [
            'menuActive'        => 'eproc',
            'post'              => $post,
            'source'            => 'Fac',
            'listeFac'          => $listeFac,
            'infoPagination'    => $infopagination,
            'parametrage'       => $this->parametrage,
            'listeReglement'    => $listeReglement,
            'listeType' => $listeType,
            'listeStatut'       => $listeStatut,
            'listeLitige'       => $listeLitige,
            'listeRupture'      => $listeRupture,
            'listeRequete'      => $listeRequete,
            'infoRupture'       => $allRupture,

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

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

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

        $ligneFac   = $this->suiviFacRepo->getLiseLigne($idDoc);

        foreach ($ligneFac as &$lig) {
            $ecartLigne = $this->serviceSuivi->getValeursEcartLigneFac($this->suiviFacRepo, $idDoc, $lig['NUM_LIG']);
            $lig = array_merge($lig, $ecartLigne);
        }

        $infoEntete = $this->suiviFacRepo->getInfoEntete($idDoc);

        $payload = [
            'doc' =>  $infoEntete['FIC_LAD'],
            'src' => 'PJ',
            'exp' => time() + 60 * 60
        ];
        
        $ficPdf = \Firebase\JWT\JWT::encode($payload, $this->JWTKEY, 'HS256');

        $type = match ($infoEntete['TYPE']??'F') {
            'C' => 'acompte',
            'A' => 'avoir',
            default => 'facture'
        };

        return $this->renderer->render('@suivi/Factures/ajaxDetailsFac', [
            'ligneFac'      => $ligneFac,
            'FIC_PDF'       => $ficPdf,
            'context'       => $context,
            'signataire'    => $signataire,
            'listeCde'      => $this->suiviCdeRepo->getCdeLinkDoc('Fac', $idDoc),
            'listeDa'       => $this->suiviDaRepo->getDaLinkDoc('Fac', $idDoc),
            'listeRecep'    => $this->suiviRecepRepo->getRecepLinkDoc('Fac', $idDoc),
            'listeFac'      => $this->suiviFacRepo->getFacLinkDoc('Fac', $idDoc, 'facture'),
            'listeAcompte' => $this->suiviFacRepo->getFacLinkDoc('Fac', $idDoc, 'acompte'),
            'listeEtatTab'  => $this->serviceSuivi->getListeStatutCde(),
            'infoEntete'    => $infoEntete,
            'source'        => $source,
            'idDoc'         => $idDoc,
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, '', 'FAC_ENT'),
            'parametrage'   => $this->parametrage,
            'type'          => $type
        ]);
    }

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

        $cgParId        = \Helpers\Outil\Roles::droit($this->pdo, 'CODE_GESTION_PAR_ID')? 1:0;
        $cgEntity       = new Codgest($this->pdo);

        $detailsLigne   = (new FacLig($this->pdo))->find(['NUM_FACT' => $idDoc, 'NUM_LIG' => $idLigne]);

        if ($cgParId) {
            $infoCg = $cgEntity->findEntity(
                $detailsLigne['CODE_STE'],
                $detailsLigne['CODE_SI'],
                $detailsLigne['ID_CG']
            );
        } else {
            $infoCg = $cgEntity->find([
                'CODE_STE'  => $detailsLigne['CODE_STE'],
                'CODE_SI'   => $detailsLigne['CODE_SI'],
                'CODE_AFF'  => $detailsLigne['ID_CG']
            ]);
        }

        $detailsLigne['LIBGES'] = $infoCg['LIBGES']??'';

        return $this->renderer->render('@suivi/Factures/ajaxDetailsLigneFac', [
            'detailsLigne'  => $detailsLigne,
            'idCS'          => ChampSupp::autoCompletCodeEnr($idDoc, $idLigne, 'FAC_LIG'),
            'parametrage'   => $this->parametrage,
        ]);
    }
}
