<?php

namespace Modules\EtatStatistiques\Repository;

use Helpers\Filter\FilterTable;
use Helpers\QueryBuilder\AbsRepository;

class EtatStat extends AbsRepository
{

    /**
     * Cette fonction va nous retourner la liste de tout les code état que l'utilisateur dispose, ce qui va nous permettre ensuite d'inserer ça dans un tableau et de traité notre affichage de liste des thèmes
     * @return array<mixed>
     */
    public function getCodeEtatByCodeUser()
    {
        $req = "SELECT * FROM ETATUSER WITH(NOLOCK) WHERE CODUSR = '" .$_SESSION['Session_Login']. "'";
        
        return $this->fetchAssocAll($req, []);
    }

    /**
     * Cette fonction va nous retourner la
     * @return array<mixed>
     */
    public function getCodeGroupeByCodeUser() : ?array
    {
        $req = "SELECT DISTINCT etgPet.CODETAT CODETAT_PET
                FROM ETGRPET etgPet WITH(NOLOCK) 
                INNER JOIN ETGRPUSR etgUsrs WITH(NOLOCK) ON etgUsrs.CODGRP =   etgPet.CODGRP 
                WHERE etgUsrs.CODUSR  = '" .$_SESSION['Session_Login']. "'";
        
        return $this->fetchAssocAll($req, []);
    }

     /**
     * Cette fonction va nous retourner la liste des themes en fonction de son parametrage USER
      * @return array<mixed>
     */
    public function getListeEtatTheme()
    {
        // TODO : use join instead
        $req = "SELECT * FROM ETATTHEM  WITH(NOLOCK) 
            WHERE CODTHEM IN (
                SELECT CODTHEM FROM ETATETTH  WITH(NOLOCK) 
                WHERE CODETAT IN (
                    SELECT CODETAT FROM ETATUSER with(nolock) 
                    WHERE CODUSR = '".$_SESSION['Session_Login']."') OR CODETAT IN (
                        SELECT CODGRP FROM ETGRPUSR WITH(NOLOCK) 
                        WHERE CODUSR = '".$_SESSION['Session_Login']."') 
                            OR CODETAT IN (
                                SELECT CODETAT FROM ETATUSER WITH(NOLOCK)
                                WHERE CODUSR = '".$_SESSION['Session_Login']."'))";

        
        return $this->fetchAssocAll($req, []);
    }



    
     /**
     * Cette fonction va nous retourner la liste des etats en fonction des ou du code etat de l'utilisateur
     * @return array<mixed>
     */
    public function listeEtatSansTheme($bool_theme)
    {
        // $req = "
        // SELECT * FROM ETATSTAT WHERE CODETAT not in (SELECT DISTINCT th.CODETAT FROM ETATTHEM them INNER JOIN ETATETTH th ON th.CODTHEM = them.CODTHEM )";
        $req ='';

        // TODO : simplify
        if ($bool_theme == false) {
            $req = " SELECT LISTETAT.TYPERES, ISNULL(LISTETAT.SOURCE, '-') AS SOURCE, LISTETAT.CODETAT, LISTETAT.DESCRIPT, LISTETAT.COMMENTAI, LISTETAT.NOMFIC, ISNULL(ETATETTH.CODTHEM, '-') AS CODTHEM, ETATTHEM.LIBELLE FROM  (
                SELECT DISTINCT ETGRPET.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.COMMENTAI, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                    FROM ETGRPET WITH(NOLOCK), ETGRPUSR WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                    WHERE ETGRPET.CODGRP = ETGRPUSR.CODGRP AND ETGRPET.CODETAT = ETATSTAT.CODETAT AND ETGRPUSR.CODUSR = '".$_SESSION['Session_Login']."'
                         AND ETATSTAT.TYPEREPORT != 'Structure'
                UNION
                SELECT ETATUSER.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.COMMENTAI, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                    FROM ETATUSER WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                    WHERE ETATUSER.CODETAT = ETATSTAT.CODETAT AND ETATSTAT.TYPEREPORT != 'Structure'  AND ETATUSER.CODUSR = '".$_SESSION['Session_Login']."'
            ) LISTETAT LEFT JOIN ETATETTH WITH(NOLOCK) ON ETATETTH.CODETAT = LISTETAT.CODETAT
            LEFT JOIN ETATTHEM WITH(NOLOCK) ON ETATETTH.CODTHEM = ETATTHEM.CODTHEM WHERE LIBELLE is null
            ORDER BY ETATETTH.CODTHEM, LISTETAT.CODETAT";
        }
        if ($bool_theme == true) {
            $req = " SELECT LISTETAT.TYPERES, isnull(LISTETAT.SOURCE, '-') as SOURCE, LISTETAT.CODETAT, LISTETAT.DESCRIPT, LISTETAT.COMMENTAI, LISTETAT.NOMFIC, isnull(ETATETTH.CODTHEM, '-') as CODTHEM, ETATTHEM.LIBELLE FROM  (
                SELECT DISTINCT ETGRPET.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.COMMENTAI, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                    FROM ETGRPET WITH(NOLOCK), ETGRPUSR WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                    WHERE ETGRPET.CODGRP = ETGRPUSR.CODGRP and ETGRPET.CODETAT = ETATSTAT.CODETAT and ETGRPUSR.CODUSR = '".$_SESSION['Session_Login']."'
                         and ETATSTAT.TYPEREPORT != 'Structure'
                union
                SELECT ETATUSER.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.COMMENTAI, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                    FROM ETATUSER WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                    WHERE ETATUSER.CODETAT = ETATSTAT.CODETAT and ETATSTAT.TYPEREPORT != 'Structure'  and ETATUSER.CODUSR = '".$_SESSION['Session_Login']."'
            ) LISTETAT  LEFT JOIN ETATETTH WITH(NOLOCK) ON ETATETTH.CODETAT = LISTETAT.CODETAT
            LEFT JOIN ETATTHEM WITH(NOLOCK) ON ETATETTH.CODTHEM = ETATTHEM.CODTHEM WHERE LIBELLE is not null
            ORDER BY ETATETTH.CODTHEM, LISTETAT.CODETAT";
        }


        return $this->fetchAssocAll($req, []);
    }
 /**
     * Cette fonction va nous retourner la liste des etats en fonction des ou des codes état de l'utilisateur
     * @return array<mixed>
     */
    public function listeEtatUser()
    {
        // $req = " SELECT * FROM ETATTHEM them INNER JOIN ETATETTH th ON th.CODTHEM = them.CODTHEM
        // INNER JOIN ETATSTAT stat ON stat.CODETAT = th.CODETAT
        // ORDER BY th.CODTHEM
        // ";


        $req = "SELECT LISTETAT.TYPERES, isnull(LISTETAT.SOURCE, '-') as SOURCE, LISTETAT.CODETAT, LISTETAT.DESCRIPT, LISTETAT.NOMFIC, isnull(ETATETTH.CODTHEM, '-') as CODTHEM, ETATTHEM.LIBELLE FROM  (
            SELECT DISTINCT ETGRPET.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                FROM ETGRPET WITH(NOLOCK), ETGRPUSR WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                WHERE ETGRPET.CODGRP = ETGRPUSR.CODGRP and ETGRPET.CODETAT = ETATSTAT.CODETAT and ETGRPUSR.CODUSR = '".$_SESSION['Session_Login']."'
                    and ETATSTAT.TYPEREPORT != 'Structure'
            union
            SELECT ETATUSER.CODETAT, ETATSTAT.DESCRIPT, ETATSTAT.SOURCE, ETATSTAT.NOMFIC, ETATSTAT.TYPERES TYPERES
                FROM ETATUSER WITH(NOLOCK), ETATSTAT WITH(NOLOCK)
                WHERE ETATUSER.CODETAT = ETATSTAT.CODETAT and ETATSTAT.TYPEREPORT != 'Structure'  and ETATUSER.CODUSR = '".$_SESSION['Session_Login']."'
        ) LISTETAT  LEFT JOIN ETATETTH WITH(NOLOCK) ON ETATETTH.CODETAT = LISTETAT.CODETAT
        LEFT JOIN ETATTHEM WITH(NOLOCK) ON ETATETTH.CODTHEM = ETATTHEM.CODTHEM WHERE LIBELLE is not null
        ORDER BY ETATETTH.CODTHEM, LISTETAT.CODETAT";
        
        return $this->fetchAssocAll($req, []);
    }

    /**
     * array_req_filtre
     * @param string $req_etat
     * @param string $code_filtre
     * @param string $val_champ
     * @return array<mixed>
     */
    // phpcs:ignore
    public function array_req_filtre($req_etat = null, $code_filtre = null, $val_champ = null) : ?array
    {
        // utiliser pour le validator
        if ($req_etat != null && $code_filtre != null) {
            $req = "SELECT * FROM FLIS_FILT_LISTE with(nolock) WHERE FLIS_CODE_FILTRE = :code_filtre and FLIS_VALEUR = :valChamp";
            $array_req = [':code_filtre' => $code_filtre, ':valChamp' => $val_champ];

            if ($val_champ != '') {
                $array_req[':libelle']=  '%'.($val_champ).'%';
                $req .= ' OR FLIS_LIBELLE LIKE :libelle';
            }
        } else {
            //fin validator
            $req = "SELECT * FROM REQ_FILTRES reqf with(nolock) JOIN FENT_FILT_ENT reqent with(nolock) ON reqent.FENT_CODE_FILTRE = reqf.CODE_FILTRE";
            $array_req = [];
        }
        
        return $this->fetchAssocAll($req, $array_req);
    }

    /**
     * sourceById
     * @param string $codEtat
     * @return Array<string>
     */
    public function sourceById(string $codEtat) : ?array
    {
        $req = "SELECT DESCRIPT, SOURCE FROM ETATSTAT with(nolock) WHERE CODETAT = :codEtat";

        $arrayReq[':codEtat'] = $codEtat;
        $requete = $this->pdo->prepare($req);
        
        $requete->execute($arrayReq);
        return $requete->fetch($this->pdo::FETCH_ASSOC);
    }
    
    /**
     * typeOngletAffichage
     * @param string $codEtat
     * @return Array<string>
     */
    public function typeOngletAffichage(string $codEtat) : ?array
    {
        
        $req = "SELECT TYPERES FROM ETATSTAT with(nolock) WHERE CODETAT = :codEtat";

        $arrayReq[':codEtat'] = $codEtat;
        $requete = $this->pdo->prepare($req);
        
        $requete->execute($arrayReq);
        return $requete->fetch($this->pdo::FETCH_ASSOC);
    }


    // OBJECT _____________________________________

    // Dans le cas ou le type d'affichage est 'USER'
    /**
     * getTypeAffichage
     * @param string $req_etat
     * @return mixed
     */
    public function getTypeAffichage(string $req_etat)
    {
        $req = "SELECT * FROM REQ_FILTRES reqf with(nolock) LEFT JOIN FENT_FILT_ENT reqent with(nolock) ON reqent.FENT_CODE_FILTRE = reqf.CODE_FILTRE WHERE REQ_ETAT = :req_etat";

        $array_req = [':req_etat' => $req_etat];
        
        return $this->fetchAssocAll($req, $array_req);
    }
    
    /**
     * getTypeAffichageInput
     * @param string $req_etat
     * @param string $input
     * @return array<string>
     */
    public function getTypeAffichageInput(string $req_etat, string $input) : ?array
    {
        $req = "SELECT * FROM REQ_FILTRES reqf 
        LEFT JOIN FENT_FILT_ENT reqent 
            ON reqent.FENT_CODE_FILTRE = reqf.CODE_FILTRE 
        WHERE REQ_ETAT = :req_etat and CODE_FILTRE=:codeFiltre";

        $array_req = [':req_etat' => $req_etat,':codeFiltre' => $input];
       
        return $this->fetchAssocOne($req, $array_req);
    }

    /**
     * existCodeEtatCs
     * @param string $codEtat
     * @return Array<mixed>
     */
    public function existCodeEtatCs(string $codEtat) : ?array
    {
        $req = "SELECT COD_TAB FROM CS_CHPS with(nolock) WHERE COD_TAB = :codEtat";
        
        $array_req = [':codEtat' => $codEtat];
        
        return $this->fetchAssocAll($req, $array_req);
    }

    /**
     * @deprecated use Sql memo instead
     * Cette fonction sera appeler dans le cas ou le type d'affichage du champ est 'R', par la suite on va donc récupérer la valeur de la colonne 'FENT_NM_REQ_LIB' et parcour la table MEMOS et donc nous récuperer la requête sql qui va nous permettre d'afficher un resultat voulue prédéfini
     * @param string $fent_nm_req_lib
     * @return array<string>
     */
    public function getRequeteByNumReqLib(string $fent_nm_req_lib) : array
    {
        $req = "SELECT CONTMEMO FROM MEMOS with(nolock) WHERE NODEMEMO  = :nodeMemo";
        
        $array_req = [':nodeMemo' => $fent_nm_req_lib];
        $inputStatistique = $this->pdo->prepare($req);
        $inputStatistique->execute($array_req);
        
        return $inputStatistique->fetch();
    }

    /**
     * TODO BBA : Attention pourquoi mettre une autre connexion pdo, sinon il faut le mettre dans le constructeur
     * Cas type affichage 'R'
     * Cette fonction est lié a 'getRequeteByNumReqLib()'
     * Elle va recupérer son resultat et donc afficher la value final.
     *
     * @param  array<mixed> $post
     * @return array<mixed>
     */
    public function getValueRequeteNumLib(array $post, \PDO $pdoDw) : array
    {
        $fentFiltre = (new \Entity\Model\FentFiltEnt($this->pdo))->find($post['CODE_FILTRE']);
        if (empty($fentFiltre)) {
            return [];
        }

        $memo = new \Entity\Model\Memos($this->pdo);
        $reqs = $memo->find($fentFiltre['FENT_NM_REQ_LIB'])['CONTMEMO'];
        // TODO : use FENT_NM_WHERE, FENT_IND_PERIMETRE, FENT_NOM_CHP_PER_SOC, FENT_NOM_CHP_PER_CONF
        $array_req = [];

        $whereArray = FilterTable::splitFilter($post, 0, 0, 0);

        $array_req = array_merge($array_req, ($whereArray[1] ?? [] ));

        $req = $reqs;
        
        if (isset($whereArray[0])) {
            $req .= $whereArray[0];
        }
        
        if (isset($whereArray['tri']) && $whereArray['tri']!='') {
            $req .= $whereArray['tri'];
        }

        // TODO : simplify
        // Swap pdo if necessary
        $mainPdo = $this->pdo;
        $this->pdo = ($fentFiltre['FENT_BASE_DE_DONNEE'] == 'OXADWDB'
            ? $pdoDw : $mainPdo);

        $res = $this->fetchAssocAll($req, $array_req);
        $this->pdo = $mainPdo;
        
        return $res;
    }
    
    /**
     * getNameByCode
     * @param string $codEtat
     * @return Array<string>
     */
    public function getNameByCode(string $codEtat) : ?array
    {
        $req = "SELECT NOMFIC 
                FROM ETATSTAT with(nolock)
                WHERE CODETAT = :codEtat";

        $arrayReq[':codEtat'] = $codEtat;
        $requete = $this->pdo->prepare($req);
        
        $requete->execute($arrayReq);
        return $requete->fetch($this->pdo::FETCH_ASSOC);
    }


    

    /**
     * Cette fonction sera utiliser pour le validator acheteur / utilisateur
     * dans le cas d'un type affichage 'R' et donc vérifier la présence de l'existance du code dans la table
     * @param string $idMemo
     * @param string $code_retour
     * @param Object $pdo
     * @return Array<mixed>
     */
    public function validatorAcheteur(string $idMemo, string $code_retour, Object $pdo)
    {
        
           $memo = new \Entity\Model\Memos($this->pdo);
           $req = $memo->find($idMemo)['CONTMEMO'];
   
           $req = explode('order by', explode('group by', $req)[0]);
   
           $reqs = "SELECT * FROM (".$req[0].") as req WHERE RETOUR = :codeRetour";
                  

           $array_req= [':codeRetour' => $code_retour];

           return $this->fetchAssocAll($reqs, $array_req);
    }



    /**

     * Cette fonction est appeler dans le cas ou le type d'affichage est 'L'
     * Elle va nous renvoyer une liste prédéfini dans une popup.
     * @param string $codeUser
     * @return array<mixed>
     */
    // phpcs:ignore
    public function liste_affichage_L(string $codeUser) : ?array
    {
        $req ="SELECT FLIS_VALEUR, FLIS_LIBELLE 
            FROM FLIS_FILT_LISTE with(nolock) 
            WHERE FLIS_CODE_FILTRE = :userCode 
            ORDER BY FLIS_NO_ORDRE";
        
        $array_req = [':userCode' => $codeUser];

        // $whereArray = FilterTable::splitFilter($post, $this->pdo, 0, 0, 0);
        // $array_req = array_merge($array_req,($whereArray[1] ?? [] ));

        // $req = $req.($whereArray[0] ?? '');

        return $this->fetchAssocAll($req, $array_req);
    }

    /**
     * csCocheOrNotListe
     * @param mixed $bool
     * @return Array<mixed>
     */
    public function csCocheOrNotListe($bool) : ?array
    {

        $req ="SELECT COD_TAB, LIBELLE FROM CS_TSTD with(nolock) WHERE TAB_CTRL = ".$bool;
        
        $array_req = [];
    
        return $this->fetchAssocAll($req, $array_req);
    }

    
    /**
     * csCocheListe
     * @param string $bool
     * @param string $cod_tab
     * @return Array<mixed>
     */
    public function csCocheListe(string $bool, $cod_tab = null) : ?array
    {
        $req = '';
        $array_req = [];

        if ($cod_tab == null) {
            $req ="SELECT COD_TAB, LIBELLE FROM CS_TSTD with(nolock) WHERE TAB_CTRL = ".$bool."";
            $array_req = [];
        } else {
            $req = "SELECT * FROM CS_TSTD with(nolock) WHERE COD_TAB = :cod_tab";
            $array_req = [':cod_tab' => $cod_tab];
        }

        return $this->fetchAssocAll($req, $array_req);
    }

    // liste des filtres dont la source est oxacharts_int et oxacharts
    /**
     * listeOxa
     * @param string $codEtat
     * @return array<array<mixed>>
     */
    public function listeOxa(string $codEtat) : ?array
    {
        $req =
            "SELECT CODETAT, CODFILTRE, MULTIPLE, TOUT 
            FROM ETATFILTRE
            WHERE CODETAT = :codEtat ORDER BY MULTIPLE";
        
        $array_req = [':codEtat' => $codEtat];
        return $this->fetchAssocAll($req, $array_req);
    }
}
