<?php
namespace Modules\Fournisseur\Controller;

use Skeleton\Controller\Controller;
use Helpers\Session\Session;
use Modules\Fournisseur\Repository\ZoneGeo;
use Modules\Fournisseur\WebService\Fournisseur;
use Helpers\Session\ParseBase1;

class ZoneGeoController extends Controller
{
    public function init()
    {
        if (!session::sessionExist('Fournisseur') && !session::sessionExist('FournisseurSimplie')) {
            return $this->redirect('Index.Index.error');
        }
    }
    
    public function creationZoneGeoAction() : string
    {
        $session = new Session('Fournisseur');

        $listeZoneGeo = new ZoneGeo($this->pdo);
        $listeZoneGeo = $listeZoneGeo->listeDecoupZG();
        
        return $this->renderer->render('@Fournisseur/zoneGeo/creationZoneGeo', [
            'menuActive' => 'Fournisseur',
            'gestion' => true,
            'menuLeft' => 'GestionFournisseur',
            'modeFournisseur' => $session->getMode(),
            "zoneGeo" => true,
            'listeZoneGeo' => $listeZoneGeo,
            
        ]);
    }
    
    public function modificationZoneGeoAction() : string
    {
        $codeFrs = $this->request->getAttribute('id');
        $session = new Session('Fournisseur');
        $ZoneGeoSession = $session->getSessionArray('zoneGeo');
        $mode = $session->getSession('etatFournisseur');
        
        if ($session->getSession('OXALINK')) {
            $codeDemande = $codeFrs;
        } else {
            $code = $codeFrs;
        }
        
        $value=[
            "Langue" => $_SESSION['Session_Langue'],
            "Login" => $_SESSION['Session_Login'],
            "no_ao" => $_SESSION["Session_SocUsr"],
            "codeFrs" => $code??'',
            'codeDemande' => $codeDemande??'',
            'affDemande' => 'TRUE',
            'mode' => $mode,
            'signa' => $session->getSession('signa'),
        ];
        
        if (!$ZoneGeoSession) {
            $xmlFile = $session->getSession('file_save_frs');
            
            if ($xmlFile) {
                $fileTMP = (new ParseBase1())->getRep()->tmp.$xmlFile;
                
                $fileContentXML = file_get_contents($fileTMP);
                $ficheFourniss = new \SimpleXMLElement($fileContentXML);
            } else {
                $ficheFourniss = new Fournisseur();
                $ficheFourniss = $ficheFourniss->ficheFournisseur($value);
                $ficheFourniss = new \SimpleXMLElement($ficheFourniss->responseData);
            }
            
            $ZoneGeoSession=[];
            if ($ficheFourniss->Fournisseur->ListZonesGeo) {
                foreach ($ficheFourniss->Fournisseur->ListZonesGeo->ZoneGeo as $value) {
                    array_push($ZoneGeoSession, ['DCOUP' =>strval($value->DCOUP), 'ETAT' => strval($value->attributes()->Etat), 'ZONEGEO' => strval($value->ZONEGEO)]);
                }
            }
            $session->setSession('zoneGeo', $ZoneGeoSession);
        }
        
        $listeZoneGeo = new ZoneGeo($this->pdo);
        $listeZoneGeo = $listeZoneGeo->listeDecoupZG();
        
        return $this->renderer->render('@Fournisseur/zoneGeo/creationZoneGeo', [
            'menuActive' => 'Fournisseur',
            'gestion' => true,
            'menuLeft' => 'GestionFournisseur',
            'modeFournisseur' => $session->getMode(),
            "zoneGeo" => true,
            'listeZoneGeo' => $listeZoneGeo,
            'id' => $codeFrs,
            
        ]);
    }
    
    public function ajaxTableauAction() : string
    {
        $regroup=$this->request->getAttribute('regroup');
        $codeAdresse = $this->request->getAttribute('codeAdresse');
        $post = $this->request->getParsedBody();
        
        $type = $this->request->getAttribute('type');

        if ($type) {
            $post['type'] = $type;
            /** @phpstan-ignore-next-line */
        } elseif (($type == '' || is_null($type)) && isset($post['type'])) {
            $type = $post['type'];
        }

        if (isset($post['type'])) {
            $session = new Session($post['type']);
        } else {
            $session = new Session('Fournisseur');
        }
        
        if ($session->getSession('etatFournisseur')=='M' || $session->getSession('ModifSigner')) {
            $lockModif = $session->getSessionArray('droitInteraction')['ZonesGeo']=='0'? true:false;
        }
        
        $post['filter_CODEDCP']=$regroup;
        
        $listeZoneGeo = new ZoneGeo($this->pdo);
        $listeZoneGeo = $listeZoneGeo->listeZoneGeoCreation($post);
        
        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($listeZoneGeo, 0, $post, $this->renderer);
        
        if ($codeAdresse) {
            $pathAjax = $this->router->generateUri('Fournisseur.ZoneGeo.ajaxTableau', ['regroup' => $regroup, 'codeAdresse' => $codeAdresse, 'type' => $type]);
            $pathSession = $this->router->generateUri('Fournisseur.ZoneGeo.sessionZoneGeo', ['codeAdresse' => $codeAdresse, 'type' => $type]);
        } else {
            $pathAjax = $this->router->generateUri('Fournisseur.ZoneGeo.ajaxTableau', ['regroup' => $regroup, 'type' => $type]);
            $pathSession = $this->router->generateUri('Fournisseur.ZoneGeo.sessionZoneGeo', ['type' => $type]);
        }
        
        return $this->renderer->render('@Fournisseur/zoneGeo/tableau-zoneGeo', [
            'listeZoneGeo' => $listeZoneGeo,
            "infoPagination" => $infopagination,
            'code_zoneGeo' => $regroup,
            'post' => $post,
            'lockModif' => $lockModif??false,
            
            'pathAjax' => $pathAjax,
            'pathSession' => $pathSession,
            'codeAdresse' => $codeAdresse,
        ]);
    }
    
    public function sessionZoneGeoAction() : string
    {
        $codeAdresse = $this->request->getAttribute('codeAdresse');
        $post = $this->request->getParsedBody();

        $HTTP_RAW_POST_DATA = file_get_contents("php://input");
        
        $post = array();
        parse_str(substr((string)$HTTP_RAW_POST_DATA, 1, -1), $post);

        if (empty($post['DCOUP'])) {
            $post['DCOUP'] =  $post['COUP'];
        }

        if (!empty($post['type'])) {
            /** @phpstan-ignore-next-line */
            $session = new Session($post['type']);
        } else {
            $session = new Session('Fournisseur');
        }
        
        if ($codeAdresse) {
            $ZoneGeo = $session->getSessionArray('zoneGeoAdresse');

            $EstPresent=false;
            
            for ($i=0; $i<count($ZoneGeo[$codeAdresse]??[]); $i++) {
                if ($ZoneGeo[$codeAdresse][$i]['DCOUP']==$post['DCOUP'] && $ZoneGeo[$codeAdresse][$i]['ZONEGEO']==$post['ZONEGEO']) {
                    //si la zone geo etait un A, c'est que la zone venait d'etre ajouter, du coup on la supprime du tableau
                    if ($ZoneGeo[$codeAdresse][$i]['ETAT']=='A' && $post['ETAT']=='S') {
                        $ZoneGeo[$codeAdresse][$i]['ETAT'] = 'S';
                    } else {
                        //sinon c'est qu'elle etait déjà dans le XML, du coup on passe son etat a S ou I (si c'est une Suprresion ou une Insertion).
                        $ZoneGeo[$codeAdresse][$i]['ETAT']=$post['ETAT']=='S'? 'S':'I';
                    }
                    
                    $EstPresent=true;
                    break;
                }
            }

            //sinon, la zone geo n'est pas dans le tableau et dans ce cas on l'ajout avec le flag etat a A afin de l'ajouter dans le XML.
            if (!$EstPresent) {
                if (isset($ZoneGeo[$codeAdresse])) {
                    array_push($ZoneGeo[$codeAdresse], ['DCOUP' => $post['DCOUP'], 'ETAT' => 'A', 'ZONEGEO' => $post['ZONEGEO']]);
                } else {
                    $ZoneGeo[$codeAdresse][]  = [
                        'DCOUP' => $post['DCOUP'],
                        'ETAT' => 'A',
                        'ZONEGEO' => $post['ZONEGEO']
                    ];
                }
            }

            $session->setSession('zoneGeoAdresse', $ZoneGeo);
        } else {
            $ZoneGeoSession = $session->getSessionArray('zoneGeo');
            
            $EstPresent=false;
            
            for ($i=0; $i<count($ZoneGeoSession); $i++) {
                if ($ZoneGeoSession[$i]['DCOUP']==$post['DCOUP'] && $ZoneGeoSession[$i]['ZONEGEO']==$post['ZONEGEO']) {
                    //si la zone geo etait un A, c'est que la zone venait d'etre ajouter, du coup on la supprime du tableau
                    if ($ZoneGeoSession[$i]['ETAT']=='A' && $post['ETAT']=='S') {
                        unset($ZoneGeoSession[$i]);
                    } else {
                        //sinon c'est qu'elle etait déjà dans le XML, du coup on passe son etat a S ou I (si c'est une Suprresion ou une Insertion).
                        $ZoneGeoSession[$i]['ETAT']=$post['ETAT']=='S'? 'S':'I';
                    }
                    
                    $EstPresent=true;
                    break;
                }
            }
            
            //sinon, la zone geo n'est pas dans le tableau et dans ce cas on l'ajout avec le flag etat a A afin de l'ajouter dans le XML.
            if (!$EstPresent) {
                array_push($ZoneGeoSession, ['DCOUP' => $post['DCOUP'], 'ETAT' => 'A', 'ZONEGEO' => $post['ZONEGEO']]);
            }
            $session->setSession('zoneGeo', $ZoneGeoSession);
        }
        
        return '';
    }
}
