<?php

namespace Modules\Fournisseur\Controller;

use Modules\Fournisseur\Service\TypeAchatService;
use Skeleton\Controller\Controller;
use Helpers\Session\Session;
use Modules\Fournisseur\Repository\TypeAchat;
use Modules\Fournisseur\WebService\Fournisseur;
use Helpers\Trad\Trad;
use Modules\Fournisseur\MenuContextuel\TypeAchatMenuContextuel;
use Helpers\Session\ParseBase1;

class TypeAchatController extends Controller
{


    public function init()
    {
        if (!session::sessionExist('Fournisseur') && !session::sessionExist('FournisseurSimplie')) {
            return $this->redirect('Index.Index.error');
        }
    }

    // phpcs:ignore
    public function TypeAchatCreationAction(): string
    {
        $post = $this->request->getParsedBody();

        $session = new Session('Fournisseur');
        $typeAchatSession = $session->getSessionArray('typeAchat');

        $listeTypeAchat = new TypeAchat($this->pdo);
        $defaut = $listeTypeAchat->TypeAchatParDefaut(); // on récupere la valeur par defaut du parametrage

        if (!$typeAchatSession) { // si le fournisseur n'a pas de type d'achat,
            array_push($typeAchatSession, ['TACFOTAC' => $defaut['TYP_ACH'], 'ETAT' => 'A', 'DEFAUT' => 1]); // on affiche le type d'achat par defaut
            $session->setSession('typeAchat', $typeAchatSession);
        }

        $listeTypeAchat = $listeTypeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH']);
        }

        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($listeTypeAchat, 0, $post, $this->renderer);

        return $this->renderer->render('@Fournisseur/TypeAchat/creationTypeAchat', [
            'modeFournisseur'   => $session->getMode(),
            'typeAchat'         => true,
            'menuActive'        => 'Fournisseur',
            'menuLeft'          => 'GestionFournisseur',
            'gestion'           => true,
            "TypeAchat"         => true,
            "listeTypeAchat"    => $listeTypeAchat,
            "infoPagination"    => $infopagination,
        ]);
    }

    // phpcs:ignore
    public function TypeAchatModicationAction(): string
    {
        $post = $this->request->getParsedBody();
        $codeFrs = $this->request->getAttribute('id');
        $session = new Session('Fournisseur');
        $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 ($mode == 'M' || $session->getSession('ModifSigner')) {
            $lockModif = $session->getSessionArray('droitInteraction')['TypeAchats'] == '0' ? true : false;
        }

        $typeAchatSession = $session->getSessionArray('typeAchat');

        if (!$typeAchatSession) {
            $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);
            }

            $typeAchatSession = [];
            if ($ficheFourniss->Fournisseur->ListTypeAchats) {
                foreach ($ficheFourniss->Fournisseur->ListTypeAchats->TypeAchats as $value) {
                    array_push(
                        $typeAchatSession,
                        ['TACFOTAC' => strval($value->TACFOTAC), 'ETAT' => strval($value->attributes()->Etat), 'DEFAUT' => strval($value->TACFODEF)]
                    );
                }
            }
            $session->setSession('typeAchat', $typeAchatSession);
        }

        $listeTypeAchat = new TypeAchat($this->pdo);
        $defaut = $listeTypeAchat->TypeAchatParDefaut(); // on récupere la valeur par defaut du parametrage

        if (!$typeAchatSession) { // si le fournisseur n'a pas de type d'achat,
            array_push($typeAchatSession, ['TACFOTAC' => $defaut['TYP_ACH'], 'ETAT' => 'A', 'DEFAUT' => 1]); // on affiche le type d'achat par defaut
            $session->setSession('typeAchat', $typeAchatSession);
        }

        $listeTypeAchat = $listeTypeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH']);
        }

        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($listeTypeAchat, 10, $post, $this->renderer);

        return $this->renderer->render('@Fournisseur/TypeAchat/creationTypeAchat', [
            'modeFournisseur' => $session->getMode(),
            'typeAchat' => true,
            'menuActive' => 'Fournisseur',
            'menuLeft' => 'GestionFournisseur',
            'gestion' => true,
            "TypeAchat" => true,
            "listeTypeAchat" => $listeTypeAchat,
            "infoPagination" => $infopagination,
            'id' => $session->getSession('CODE'),
            'lockModif' => $lockModif ?? false,
        ]);
    }

    public function popupAjoutTypeAchatAction(): string
    {
        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');

        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
        }
        $typeAchat = $session->getSessionArray('typeAchat');

        $listeTypeAchat = new TypeAchat($this->pdo);
        $listeTypeAchat = $listeTypeAchat->ListeTypeAchat($typeAchat, $post);

        $trad = $this->getTranslationService();

        $paginator = new \Helpers\Pagination\Paginator();
        $infopagination = $paginator->generate($listeTypeAchat, 10, $post, $this->renderer);

        return $this->renderer->render('@Fournisseur/Popup-typeAchat/listeTypeAchat', [
            'listeTypeAchat' => $listeTypeAchat,
            'infoPagination' => $infopagination,
            'id' => $session->getSession('CODE'),
            'type' => $type
        ]);
    }

    public function ajaxAjoutTypeAchatAction(): string
    {
        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');

        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
        }
        $typeAchatSession = $session->getSessionArray('typeAchat');

        $EstPresent = false;
        foreach ($typeAchatSession as &$typAchat) {
            if ($typAchat['TACFOTAC'] == $post['entity']) {
                $typAchat['ETAT'] = 'A';
                $EstPresent = true;
                break;
            }
        }

        if (!$EstPresent) {
            array_push($typeAchatSession, ['TACFOTAC' => $post['entity'], 'ETAT' => 'A', 'DEFAUT' => 0]);
        }

        $session->setSession('typeAchat', $typeAchatSession);

        $typeAchat =  new TypeAchat($this->pdo);
        $listeTypeAchat = $typeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH'], true);
        }

        if ($type) {
            return (string)json_encode(
                [
                    'path' => $this->router->generateUri('Fournisseur.TypeAchat.ajaxTypeAchatTableau', ['type' => $type]),
                    'pathOnlyRedirect' => false
                ]
            );
        }

        return '';
    }

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

        $type = $this->request->getAttribute('type');
        $typAch = $this->request->getAttribute('typAch');


        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
        }
        $typeAchatSession = $session->getSessionArray('typeAchat');

        for ($i = 0; $i < count($typeAchatSession); $i++) {
            if ($typeAchatSession[$i]['TACFOTAC'] == $typAch) {
                $typeAchatSession[$i]['ETAT'] = 'S';
            }
        }

        $session->setSession('typeAchat', $typeAchatSession);

        $typeAchat =  new TypeAchat($this->pdo);
        $listeTypeAchat = $typeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH'], true);
        }

        if ($type) {
            return (string)json_encode(
                [
                    'path' => $this->router->generateUri('Fournisseur.TypeAchat.ajaxTypeAchatTableau', ['type' => $type]),
                    'pathOnlyRedirect' => false

                ]
            );
        }

        return '';
    }

    public function ajaxDefautTypeAchatAction(): string
    {
        $type = $this->request->getAttribute('type');
        $typAch = $this->request->getAttribute('typAch');

        if ($type) {
            $session = new Session($type);
        } else {
            $session = new Session('Fournisseur');
        }
        $typeAchatSession = $session->getSessionArray('typeAchat');

        foreach ($typeAchatSession as &$typAchat) {
            if ($typAchat['TACFOTAC'] == $typAch) {
                $typAchat['DEFAUT'] = '1';
            } else {
                $typAchat['DEFAUT'] = '0';
            }
        }



        $session->setSession('typeAchat', $typeAchatSession);

        $typeAchat =  new TypeAchat($this->pdo);
        $listeTypeAchat = $typeAchat->ListeTypeAchatFournisseur($typeAchatSession, []);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH'], true);
        }

        if ($type) {
            return (string)json_encode(
                [
                    'path' => $this->router->generateUri('Fournisseur.TypeAchat.ajaxTypeAchatTableau', ['type' => $type]),
                    'pathOnlyRedirect' => false
                ]
            );
        }
        return '';
    }

    public function ajaxTypeAchatTableauAction(): string
    {
        $post = $this->request->getParsedBody();
        $type = $this->request->getAttribute('type');
        
        $trad = $this->getTranslationService();

        // $listeTypeAchat = (new TypeAchatService($this->pdo, $this->getTranslationService(), $this->router))->getPurchaseTypeList($type ?? 'Fournisseur');

        if ($type) {
            $sessionFournisseur = new Session($type);
        } else {
            $sessionFournisseur = new Session('Fournisseur');
        }

        $typeAchatSession = $sessionFournisseur->getSessionArray('typeAchat');
        $listeTypeAchat = new TypeAchat($this->pdo);
        $defaut = $listeTypeAchat->TypeAchatParDefaut(); // on récupere la valeur par defaut du parametrage

        if (!$typeAchatSession) { // si le fournisseur n'a pas de type d'achat,
            $array = ['TACFOTAC' => $defaut['TYP_ACH'], 'ETAT' => 'A', 'DEFAUT' => 1];
            array_push($typeAchatSession, $array); // on affiche le type d'achat par defaut
            $sessionFournisseur->setSession('typeAchat', $typeAchatSession);
        }

        $listeTypeAchat = $listeTypeAchat->ListeTypeAchatFournisseur($typeAchatSession, $post);
        $menuContextuel = new TypeAchatMenuContextuel($this->pdo, $this->router, $this->getTranslationService());

        foreach ($listeTypeAchat as &$typeAchat) { // pour savoir si l'element est par defaut ou pas
            foreach ($typeAchatSession as $tpAchatSession) {
                if ($typeAchat['TYP_ACH'] == $tpAchatSession['TACFOTAC']) {
                    $typeAchat['DEFAUT'] = $tpAchatSession['DEFAUT'];
                }
            }
            $typeAchat['menuContextuel'] = $menuContextuel->generate($typeAchat['LIB_TAC'], $typeAchat['TYP_ACH'], true);
        }

        $paginator = new \Helpers\Pagination\Paginator();
        $infopaginationTypeAchat = $paginator->generate($listeTypeAchat, 0, $post, $this->renderer);

        return $this->renderer->render('@Fournisseur/TypeAchat/Ajax-TypeAchatTableau', [

            'infopaginationTypeAchat' => $infopaginationTypeAchat ?? [],
            'listeTypeAchat' => $listeTypeAchat ?? [],
            'trad' => $trad
        ]);
    }
}
