<?php

namespace Modules\Delegation\Service;

use Entity\Model\Paravrac;
use Entity\Model\WfDelDec;
use Entity\Model\WfDelRol;
use Helpers\Log\LogSysteme;
use Helpers\Outil\Sql;
use Helpers\Trad\ITrad;
use Modules\Delegation\Repository\Delegation;
use Modules\Delegation\WebService\PermanentDelegation;

class PermanentDelegationService
{
    private \PDO $pdo;
    private ITrad $trad;

    /**
     * __construct
     *
     * @param  \PDO $pdo
     * @param  ITrad $trad
     * @return void
     */
    public function __construct(\PDO $pdo, ITrad $trad)
    {
        $this->pdo = $pdo;
        $this->trad = $trad;
    }

    /**
     * getTriggersList retourne la liste des déclencheurs possibles d'une délégation
     *
     * @return array<mixed>
     */
    public function getTriggersList(string $societe = ''): array
    {
        $paravrac = new Paravrac($this->pdo);
        $uoSecto = Sql::toBool($paravrac->getForSte('UOSECTO'));
        $siSecto = Sql::toBool($paravrac->getForSte('SISECTOR'));
        $cdcSecto = Sql::toBool($paravrac->getForSte('CDCSECTO'));
        $scaSecto = Sql::toBool($paravrac->getForSte('SCASECTO'));
        $data = (new PermanentDelegation())->getTriggersList();
        $response = new \SimpleXMLElement($data->responseData);
        $triggersList = [
            '' => $this->trad->t('Sélectionnez un déclencheur')
        ];

        /* on vérifie quelles sont les tables sectorisées, si elles sont sectorisées on ne propose pas le déclencheur
        si le code ste n'est pas renseigné */

        if ($response->Statut == 'O') {
            foreach ($response->ListeDeclencheurs as $declencheur) {
                foreach ($declencheur as $v) {
                    if ($societe == '') {
                        switch ((string)$v->CodeDeclencheur) {
                            case 'CENTRE_E':
                                break;
                            
                            case 'CENTRE_R':
                                break;
                            
                            case 'SSITESTO':
                                break;
                            
                            case 'UO':
                                if (!$uoSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'SECTIMPU':
                                if (!$siSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'DIRECTIO':
                                if (!$siSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'CODECOMP':
                                if (!$cdcSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'NATANA':
                                if (!$cdcSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'SSCPTANA':
                                if (!$scaSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            case 'CENTRANA':
                                if (!$scaSecto) {
                                    $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                }
                                break;
                            
                            default:
                                $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                                break;
                        }
                    } else {
                        $triggersList[(string)$v->CodeDeclencheur] = (string)$v->LibelleDeclencheur;
                    }
                }
            }
        }

        return $triggersList;
    }

    /**
     * updateDeclencheurs
     *
     * @param  array<mixed> $post
     * @return bool
     */
    public function updateDeclencheurs(array $post): bool
    {
        (new WfDelDec($this->pdo))
            ->delete([
                'CODE_SIGN' => $_SESSION['Session_Login'],
                'CODE_DEL' => $post['CODE_DEL'],
            ]);


        $declencheurs = [];

        foreach ($post as $key => $value) {
            if (strpos($key, 'CODE_TABLE') === 0) {
                $id = substr($key, -1);
                $declencheurs[] = [
                    'CODE_TABLE' => $value,
                    'OPERATEUR' => $post['OPERATEUR' . $id],
                    'CODE_ENREG' => $post['CODE_ENREG' . $id],
                ];
            }
        }

        if (!empty($declencheurs)) {
            return (new Delegation($this->pdo))->multiInsertDeclencheurs($declencheurs, $post['CODE_DEL']);
        }

        return true;
    }

    /**
     * updateRoles
     *
     * @param  array<mixed> $post
     * @return bool
     */
    public function updateRoles(array $post): bool
    {
        (new WfDelRol($this->pdo))
            ->delete([
                'CODE_SIGN' => $_SESSION['Session_Login'],
                'CODE_DEL' => $post['CODE_DEL'],
            ]);


        $roles = [];

        foreach (array_keys($post) as $key) {
            if (strpos($key, 'IS_SELECTED') === 0) {
                $data = explode('-', $key);
                $roles[] = [
                    'NUM_WF' => $data[1],
                    'NUM_ROLE' => $data[2],
                ];
            }
        }

        if (!empty($roles)) {
            return (new Delegation($this->pdo))->multiInsertRoles($roles, $post['CODE_DEL']);
        }

        return true;
    }

    /**
     * getPermanentDelegationsByDeclencheurs
     *
     * @param  string $deleg
     * @return array<mixed>
     */
    public function getPermanentDelegationsByDeclencheurs(string $deleg): array
    {
        $data = (new Delegation($this->pdo))->getPermanentDelegationsByDeclencheurs($deleg);
        $delegations = [];

        // on corrige les différences entre les codes table des délégations et les codes des entités de l'app
        foreach ($data as $k => $v) {
            switch ($v['CODE_TABLE']) {
                case 'ACD':
                    $delegations[] = $v + [
                        'ENTITY' => 'acccadre',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];

                    break;
                case 'TYPDOC':
                    $delegations[] = $v + [
                        'ENTITY' => 'typeDoc',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'CENTRE_E':
                    $delegations[] = $v + [
                        'ENTITY' => 'Centre',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'CENTRE_R':
                    $delegations[] = $v + [
                        'ENTITY' => 'Centre',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'DEMANDEU':
                    $delegations[] = $v + [
                        'ENTITY' => 'HASTUTIL',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'UO':
                    $delegations[] = $v + [
                        'ENTITY' => 'Uo',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'FOURNISS':
                    $delegations[] = $v + [
                        'ENTITY' => 'Fourniss',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'SECTIMPU':
                    $delegations[] = $v + [
                        'ENTITY' => 'Sectimpu',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'CODECOMP':
                    $delegations[] = $v + [
                        'ENTITY' => 'Codecomp',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'SSCPTANA':
                    $delegations[] = $v + [
                        'ENTITY' => 'Sscptana',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'DIRECTIO':
                    $delegations[] = $v + [
                        'ENTITY' => 'Directio',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'CENTRANA':
                    $delegations[] = $v + [
                        'ENTITY' => 'Centrana',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'NATANA':
                    $delegations[] = $v + [
                        'ENTITY' => 'Natana',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'FAMILLE':
                    $delegations[] = $v + [
                        'ENTITY' => 'Famille',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'SSFAMILL':
                    $delegations[] = $v + [
                        'ENTITY' => 'SousFamille',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'MARCHES':
                    $delegations[] = $v + [
                        'ENTITY' => 'Marches',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'SSITESTO':
                    $delegations[] = $v + [
                        'ENTITY' => 'ssItesto',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
                case 'ARTICLES':
                    $delegations[] = $v + [
                        'ENTITY' => 'Articles',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;

                default:
                    $delegations[] = $v + [
                        'ENTITY' => '',
                        'zoomInfo' => $this->getZoomInputInfo($v['CODE_TABLE'], $k + 1)
                    ];
                    break;
            }
        }

        return $delegations;
    }

    /**
     * getZoomInputInfo retourne les infos pour les inputs zoom créés de manière
     * dynamique quand on sélectionne un déclencheur
     *
     * @param  string $table
     * @param  int $id
     * @return array<mixed>
     */
    public function getZoomInputInfo(string $table, int $id): array
    {
        switch ($table) {
            case 'ACD':
                $data = [
                    'pathZoom' => 'Ajax.liste.accadre',
                    'paramZoom' => "{'valide' : '1'}",
                    'titleZoom' => $this->trad->t('Liste des accords-cadres'),
                    'entity' => 'acccadre',
                    'paramsValidator' => "{'entity' : 'acccadre', 'nomChamp' : '" . $this->trad->t('Accords-cadres') . "', 'null' : false}",
                ];
                break;
            case 'TYPDOC':
                $data = [
                    'pathZoom' => 'Ajax.liste.typeDoc',
                    'paramZoom' => "{'valide' : true, 'oxaproc' : 1}",
                    'titleZoom' => $this->trad->t('Liste des types de documents'),
                    'entity' => 'typeDoc',
                    'paramsValidator' => "{'entity' : 'typeDoc', 'nomChamp' : '" . $this->trad->t('Types de documents') . "', 'null' : false}",
                ];
                break;
            case 'CENTRE_E':
                $data = [
                    'pathZoom' => 'Ajax.liste.centreEmetteur',
                    'paramZoom' => "{'code_ste' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des centres'),
                    'entity' => 'Centre',
                    'paramsValidator' => "{'entity' : 'typeDoc', 'nomChamp' : '"
                        . $this->trad->t('Centres émetteurs')
                        . "', 'null' : false, 'post' : {'filter_EMISSION' : 'T', 'filter_CODE_STE' : ''}",
                ];
                break;
            case 'CENTRE_R':
                $data = [
                    'pathZoom' => 'Ajax.liste.centreLivraison',
                    'paramZoom' => "{'code_ste' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des centres'),
                    'entity' => 'Centre',
                    'paramsValidator' => "{'entity' : 'typeDoc', 'nomChamp' : '"
                        . $this->trad->t('Centres de livraison')
                        . "', 'null' : false, 'post' : {'filter_EMISSION' : 'T', 'filter_CODE_STE' : $('#input_CODE_STE').val()}",
                ];
                break;
            case 'DEMANDEU':
                $data = [
                    'pathZoom' => 'Ajax.liste.demandeur',
                    'paramZoom' => "{'filter_egal_CODE_STE' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des demandeurs'),
                    'entity' => 'HASTUTIL',
                    'paramsValidator' => "{'entity' : 'HASTUTIL', 'nomChamp' : '"
                        . $this->trad->t('Demandeurs')
                        . "', 'null' : false, 'post' : {'filter_egal_CODE_STE' : $('#input_CODE_STE').val(),  'filter_DEMAND' : 'T'}",
                ];
                break;
            case 'UO':
                $data = [
                    'pathZoom' => 'Ajax.Treeview.uoTreeview',
                    'paramZoom' => "{'CODE_STE' : $('#input_CODE_STE').val(), 'input' : 'CODE_ENREG" . $id . "'}",
                    'titleZoom' => $this->trad->t('Liste des unités organisationnelles'),
                    'entity' => 'Uo',
                    'paramsValidator' => "{'entity' : 'Uo', 'nomChamp' : '" . $this->trad->t('Unités organisationnelles') . "', 'null' : false}",
                ];
                break;
            case 'FOURNISS':
                $data = [
                    'pathZoom' => 'Ajax.liste.fournisseur',
                    'paramZoom' => '',
                    'titleZoom' => $this->trad->t('Liste des fournisseurs'),
                    'entity' => 'Fourniss',
                    'paramsValidator' => "{'entity' : 'Fourniss', 'nomChamp' : '" . $this->trad->t('Fournisseurs') . "', 'null' : false}",
                ];
                break;
            case 'SECTIMPU':
                $data = [
                    'pathZoom' => 'Ajax.liste.si',
                    'paramZoom' => "{'si_valide': 'on', 'CODE_STE' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des sections d\'imputation'),
                    'entity' => 'Sectimpu',
                    'paramsValidator' => "{'entity' : 'Sectimpu', 'nomChamp' : '" . $this->trad->t('Sections d\'imp.') . "', 'null' : false}",
                    'faceAttr' => [
                        'data-stelink' => 'input_CODE_STE',
                    ]
                ];
                break;
            case 'CODECOMP':
                $data = [
                    'pathZoom' => 'Ajax.liste.cdc',
                    'paramZoom' => "{'filter_egal_CODE_STE' : $('#input_CODE_STE').val(), 'cdc_valide' : 1 }",
                    'titleZoom' => $this->trad->t('Liste des codes complémentaires'),
                    'entity' => 'Codecomp',
                    'paramsValidator' => "{'entity' : 'Codecomp', 'nomChamp' : '" . $this->trad->t('Codes compl.') . "', 'null' : false}",
                    'faceAttr' => [
                        'data-stelink' => 'input_CODE_STE',
                    ]
                ];
                break;
            case 'SSCPTANA':
                $data = [
                    'pathZoom' => 'Ajax.liste.sca',
                    'paramZoom' => "{'filter_egal_CODE_STE' : $('#input_CODE_STE').val(), 'sca_valide' :1}",
                    'titleZoom' => $this->trad->t('Liste des sous-comptes d\'analyse'),
                    'entity' => 'Sscptana',
                    'paramsValidator' => "{'entity' : 'Sscptana', 'nomChamp' : '" . $this->trad->t('Sous-comptes d\'analyse') . "', 'null' : false}",
                    'faceAttr' => [
                        'data-stelink' => 'input_CODE_STE',
                    ]
                ];
                break;
            case 'DIRECTIO':
                $data = [
                    'pathZoom' => 'Ajax.liste.directio',
                    'paramZoom' => "{'si_valide': 'on', 'CODE_STE' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des directions'),
                    'entity' => 'Directio',
                    'paramsValidator' => "{'entity' : 'Directio', 'nomChamp' : '" . $this->trad->t('Directions') . "', 'null' : false}",
                ];
                break;
            case 'CENTRANA':
                $data = [
                    'pathZoom' => 'Ajax.liste.centrana',
                    'paramZoom' => "{'CODE_STE' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des centres d\'analyse'),
                    'entity' => 'Centrana',
                    'paramsValidator' => "{'entity' : 'Centrana', 'nomChamp' : '" . $this->trad->t('Centres d\'analyse') . "', 'null' : false}",
                ];
                break;
            case 'NATANA':
                $data = [
                    'pathZoom' => 'Ajax.liste.natana',
                    'paramZoom' => "{'CODE_STE' : $('#input_CODE_STE').val(), 'sca_valide' :1}",
                    'titleZoom' => $this->trad->t('Liste des natures analytiques'),
                    'entity' => 'Natana',
                    'paramsValidator' => "{'entity' : 'Natana', 'nomChamp' : '" . $this->trad->t('Natures analytiques') . "', 'null' : false}",
                ];
                break;
            case 'FAMILLE':
                $data = [
                    'pathZoom' => 'Ajax.liste.famille',
                    'paramZoom' => "",
                    'titleZoom' => $this->trad->t('Liste des Familles'),
                    'entity' => 'Famille',
                    'paramsValidator' => "{'entity' : 'Famille', 'nomChamp' : '" . $this->trad->t('Familles') . "', 'null' : false}",
                ];
                break;
            case 'SSFAMILL':
                $data = [
                    'pathZoom' => 'Ajax.liste.sousFamille',
                    'paramZoom' => "",
                    'titleZoom' => $this->trad->t('Liste des sous-familles'),
                    'entity' => 'SousFamille',
                    'paramsValidator' => "{'entity' : 'SousFamille', 'nomChamp' : '" . $this->trad->t('Sous-familles') . "', 'null' : false}",
                ];
                break;
            case 'MARCHES':
                $data = [
                    'pathZoom' => 'Ajax.liste.marches',
                    'paramZoom' => '',
                    'titleZoom' => $this->trad->t('Liste des marchés'),
                    'entity' => 'Marches',
                    'paramsValidator' => "{'entity' : 'Marches', 'nomChamp' : '" . $this->trad->t('Marchés') . "', 'null' : false}",
                ];
                break;
            case 'SSITESTO':
                $data = [
                    'pathZoom' => 'Ajax.liste.ssItesto',
                    'paramZoom' => "{'CODE_STE' : $('#input_CODE_STE').val()}",
                    'titleZoom' => $this->trad->t('Liste des sites de stock'),
                    'entity' => 'ssItesto',
                    'paramsValidator' => "{'entity' : 'ssItesto', 'nomChamp' : '" . $this->trad->t('Sites de stock') . "', 'null' : false}",
                ];
                break;
            case 'ARTICLES':
                $data = [
                    'pathZoom' => 'Ajax.liste.articles',
                    'paramZoom' => '',
                    'titleZoom' => $this->trad->t('Liste des articles'),
                    'entity' => 'Articles',
                    'paramsValidator' => "{'entity' : 'Articles', 'nomChamp' : '" . $this->trad->t('Articles') . "', 'null' : false}",
                ];
                break;

            default:
                LogSysteme::prefixErrorLog('Invalid code table "'.$table.'"');
                $data = [
                    'pathZoom' => '',
                    'paramZoom' => '',
                    'titleZoom' => '',
                    'entity' => '',
                    'paramsValidator' => '',
                ];
                break;
        }

        return $data;
    }
}
