<?php

namespace Modules\Suivi\Service;

use Entity\Model\CaEntet;
use Entity\Model\DaEntet;
use Helpers\Outil\Outils;
use Helpers\Outil\Sql;
use Helpers\Securite\Securite;
use Helpers\Trad\ITrad;
use Modules\Ajax\Repository\Listes;
use Modules\DemandeAchat\Repository\DemandeAchat;
use Modules\Index\Outil\OutilConnexion;
use Modules\Index\Service\SessionService;
use Modules\Panier\Service\PanierService;
use Modules\RechercheArticles\Repository\Recherche;
use Modules\RechercheArticles\Service\OutilRechercheService;
use Modules\Suivi\Repository\SuiviCdeRepo;
use Modules\Suivi\Repository\SuiviDaRepo;
use Modules\Suivi\Repository\SuiviRepo;
use Skeleton\Renderer\RendererInterface;
use Skeleton\Router;
use Psr\Container\ContainerInterface;

class ChargeDocToPanierService
{
    /**
     * @var \PDO $pdo
     */
    private $pdo;

    private ITrad $trad;

    private RendererInterface $renderer;

    private Router $router;

    public function __construct(\pdo $pdo, RendererInterface $renderer, Router $router, ITrad $trad)
    {
        $this->pdo = $pdo;
        $this->trad = $trad;
        $this->renderer = $renderer;
        $this->router = $router;
    }

    /**
     * Undocumented function
     *
     * @param string $action
     * @param string $typeDoc
     * @param string $idDoc
     * @param array<mixed> $post
     * @return void|string
     */
    public function controleDocument(\PDO $pdoOxaFT, string $action, string $typeDoc, string $idDoc, $post)
    {
        $outilRechercheCenter = new OutilRechercheService($this->pdo);
        $centre = $outilRechercheCenter->getCentreRecherche();

        $entete = [];
        if ($typeDoc == 'DA') {
            $entete     = (new DemandeAchat($this->pdo))->listeDemandeAchat([
                'filter_egal_DA_ENTET.NO_DA' => $idDoc,
            ])[0] ?? null;
            //$entete     = (new DaEntet($this->pdo))->find($idDoc);
            $codeFou    = $entete['FOU'];
        } elseif ($typeDoc == 'CDE') {
            $entete     = (new CaEntet($this->pdo))->find($idDoc);
            $codeFou    = $entete['CODE_FOU'];
        }

        // TODO : simplify etape system

        // Etape life cycle :
        // - <empty> check all rules
        // - 'confirm_consult' ignore "consultation non terminé" warning
        // - 'changeSte' ignore "Societe" warning and warning from previous step
        // - 'confirm' ignore all warning

        if ($typeDoc == 'DA'
            && $entete['ETAT'] == 'ao_pending'
            && empty($post['etape'])
        ) {
            return $this->renderer->render('@suivi/Global/popupMessage', [
                'message' => $this->trad->t('Une consultation non terminée est présente sur cette demande d’achat, souhaitez-vous continuer ?'),
                'path' => $this->router->generateUri(
                    'Suivi.Suivi.popChargeDocToPanier',
                    ['action' => $action, 'idDoc' => $idDoc, 'typeDoc' => $typeDoc]
                ),
                'etape' => 'confirm_consult',
            ]);
        }

        // contrôle que le fournisseur soit accessible sur la société
        if (Sql::paravrac($this->pdo, 'OXAPROC', 'LSTFOUR_FILTREZONEGEO') == 'O') {
            $liste  = new Listes($this->pdo, false);
            
            $frs    = $liste->Fournisseur([
                        'activeZone'        => (new Recherche($this->pdo))->zoneGeoActive($centre)['active'],
                        'centre'            => $centre,
                        'filter_egal_CODE'  => $codeFou??'',
                    ]);

            if (!$frs) {
                return $this->renderer->render('@popup-erreur/ErreurCreation', [
                    'ErreurValid' => $this->trad->t('Le fournisseur n\'est pas autorisé pour cette société.'),
                ]);
            }
        }

        if ($_SESSION['Session_SocUsr'] != ($entete['CODE_STE']??'')
            && ! in_array($post['etape']??'', ['confirm', 'changeSte'])
        ) {
            if ($action == 'modificationChifExe' || $action == 'CreationAvenant' || $action == 'modification') {
                $message = $this->trad->t('La société de rattachement du document est différente de votre société de session.');
                $message .= "<br />";
                $message .= $this->trad->t('Votre session va donc être réinitialisée avec la société du document');


                $sessionService         = new SessionService($this->pdo);
                $valeur_init_session    = $sessionService->getAllValueInitSessionByUserAndSociete($_SESSION['Session_Login'], $entete['CODE_STE']);
    
                $sessionService->setAllFieldsSessionUser($valeur_init_session);
            } else {
                $message = $this->trad->t('La société de rattachement du document est différente de votre société de session.');
                $message .= "\n";
                $message .= $this->trad->t('Par conséquent, les données du document liées à la société seront ré-initialisées');
            }

            return $this->renderer->render('@suivi/Global/popupMessage', [
                'message' => $message,
                'path' => $this->router->generateUri(
                    'Suivi.Suivi.popChargeDocToPanier',
                    ['action' => $action, 'idDoc' => $idDoc, 'typeDoc' => $typeDoc]
                ),
                'etape' => 'changeSte',
            ]);
        }
    }

    /**
     * Undocumented function
     *
     * @param string $idDoc
     * @param string $typeDoc
     * @param string $action
     * @param array<mixed> $post
     * @return void|string
     */
    public function controlePJClause(string $action, string $typeDoc, string $idDoc, array $post)
    {
        $suiviRepo = new SuiviRepo($this->pdo, $this->router, $this->trad);

        // Etape 2 : On verifie les PJ/
        $isCdeFromDAoxaproc = $suiviRepo->isCdeFromDAoxaproc($idDoc);

        if ($typeDoc == 'DA'
            || (
                $typeDoc == 'CDE'
                && (
                    !$isCdeFromDAoxaproc['NB_DA_FOR_CDE']
                    || $action == 'CreationAvenant'
                )
            )
        ) {
            $this->deletePanier();

            if (($post['etape']??'') == 'confirm') {
                $liste = [
                    'panier' => $_SESSION['id_panier'],
                    'user' => $_SESSION['id_user'],
                    'doc' => $idDoc,
                    'type' => $typeDoc,
                    'post' => $post,
                ];
                $_SESSION['cache_copie_pj'] = Securite::encodeChiffrageFormMagic(serialize($liste), false);
            } else {
                $_SESSION['cache_copie_pj'] = Securite::encodeChiffrageFormMagic(serialize([]), false);

                $liste_pj = null;
                $liste_clause = null;

                $listeFrs['NON_DEFINI']     = $this->trad->t('Non reprise');
                switch ($typeDoc) {
                    case 'DA':
                        $suiviDa            = new SuiviDaRepo($this->pdo, $this->router, $this->trad);

                        $listeLigne         = $suiviDa->getLiseLigne($idDoc);

                        foreach ($listeLigne as $frs) {
                            if ($frs['CODE_FOU']) {
                                $listeFrs[$frs['CODE_FOU']] = $frs['RS'];
                            } else {
                                $listeFrs[''] = $this->trad->t('Ligne sans fournisseur');
                            }
                        }
        
                        $liste_pj       = $suiviDa->getPJ($idDoc);
                        $liste_clause   = $suiviDa->getClause($idDoc);
                        break;
                    case 'CDE':
                        $suiviCde       = new SuiviCdeRepo($this->pdo, $this->router, $this->trad);

                        $enteteCde      = $suiviCde->getInfoEntete($idDoc);

                        
                        $listeFrs[$enteteCde['CODE_FOU']] = $enteteCde['RS'];
                        
                        $liste_pj       = $suiviCde->getPJ($idDoc);
                        $liste_clause   = $suiviCde->getClause($idDoc);

                        break;
                }
                
                if ($action != 'CreationAvenant' && ($liste_pj || $liste_clause)) {
                    return $this->renderer->render('@suivi/Global/popupPjClause', [
                        'path'          => $this->router->generateUri(
                            'Suivi.Suivi.popChargeDocToPanier',
                            ['action' => $action, 'typeDoc' => $typeDoc, 'idDoc' => $idDoc]
                        ),
                        'listePj'       => $liste_pj,
                        'listeClause'   => $liste_clause,
                        'listeFrs'      => $listeFrs,
                    ]);
                }
            }
        }
    }

    public function deletePanier() : void
    {
        (new PanierService($this->pdo))->delete('0', $this->trad);
    }
}
