<?php

namespace Modules\Ajax\Repository;

class UO
{
    protected $pdo;
    
    public function __construct(\PDO $pdo)
    {
        $this->pdo = $pdo;
    }
    
    /**
     * getListeParentUOByUO
     * @param bool $isUOSecto
     * @param string $code_uo
     * @param string $code_ste
     * @param array<mixed> $liste_uo_trouve
     */
    public function getListeParentUOByUO($isUOSecto, String $code_uo, &$liste_uo_trouve, string $code_ste)
    {
        $liste_uo_parent = $this->rqGetParentUOByUO($isUOSecto, $code_uo, $code_ste);
        if ($liste_uo_parent && is_array($liste_uo_parent)) {
            foreach ($liste_uo_parent as & $uo_parent) {
                if ($uo_parent['UO_MERE'] != '') {
                    $liste_uo_trouve[] = $uo_parent['UO_MERE'];
                    $this->getListeParentUOByUO($isUOSecto, $uo_parent['UO_MERE'], $liste_uo_trouve, $code_ste);
                }
            }
        }
    }
    
    /**
     * rqGetParentUOByUO
     * @param string $uo
     * @param string $ste
     * @return array<mixed>
     */
    public function rqGetParentUOByUO($isUOSecto, String $uo, String $ste = '') : ?array
    {

        $reqUOMere = "SELECT UO_MERE FROM UO with(nolock) WHERE CODE_UO = :codeUO order by CODE_UO";
        $arrayReqUOMere = [':codeUO' => $uo];
        
        
        if ($isUOSecto && $ste != '') {
            $reqUOMere .= "AND CODE_STE = :codeSte";
            $arrayReqUOMere[':codeSte'] = $ste;
        }
        
        $uoMere = $this->pdo->prepare($reqUOMere);
        $uoMere->execute($arrayReqUOMere);

        $return = $uoMere->fetchAll($this->pdo::FETCH_ASSOC);
        if ($return) {
            return $return;
        } else {
            return [];
        }
    }
    
    // Fonction ramenant la liste des UO fille d'une UO passer en parametre pour une societe donnée.

    /**
     * trouveFilleUO
     * @param bool $isUOSecto
     * @param string $code_ste
     * @param array<mixed> $retourUO
     */
    public function trouveFilleUO(Bool $isUOSecto, String $code_ste, string $UO, &$retourUO) : void
    {
        $retourUO[$UO] = $UO;

        if ($isUOSecto) {
            $record = $this->sqlUOFille($code_ste, $UO);
        } else {
            $record = $this->sqlUOFille('', $UO);
        }

        foreach ($record as $r) {
            if ($r['CODE_UO']) {
                $retourUO[$r['CODE_UO']] = $r['CODE_UO'];
                $this->trouveFilleUO($isUOSecto, $code_ste, $r['CODE_UO'], $retourUO);
            }
        }
    }
    
   
    /**
     * sqlUOFille
     * @param string $code_ste
     * @param string $uo
     * @return array<mixed>
     */
    public function sqlUOFille(String $code_ste, String $uo) : ?array
    {
        $arrayReq = [':codeUO' => $uo];
        
        if (trim($code_ste) == '') {
            $req = "SELECT * FROM UO with (nolock) WHERE CODE_STE = ' ' AND UO_MERE = :codeUO ORDER BY CODE_UO";
        } else {
            $req = "SELECT * FROM UO with (nolock) WHERE CODE_STE = :codeSte AND UO_MERE = :codeUO' ORDER BY CODE_UO";
            $arrayReq[':codeSte'] = $code_ste;
        }
        
        $uofille = $this->pdo->prepare($req);
        $uofille->execute($arrayReq);

        $return = $uofille->fetchAll($this->pdo::FETCH_ASSOC);
        if ($return) {
            return $return;
        } else {
            return [];
        }
    }
    
    // nous ramene les UO filles d'une liste de UO
   
    /**
     * sqlUOFilleListe
     * @param string $code_ste
     * @param string $listeUO
     * @return array<mixed>
     */
    public function sqlUOFilleListe(String $code_ste, String $listeUO) : ?array
    {
        $arrayReq = [':listeUO' => $listeUO];
        
        if (trim($code_ste) == '') {
            $sql = "SELECT CODE_UO FROM UO with (nolock) WHERE CODE_STE = ' ' AND UO_MERE in :listeUO ORDER BY CODE_UO";
        } else {
            $sql = "SELECT CODE_UO FROM UO with (nolock) WHERE CODE_STE = :codeSte AND UO_MERE in :listeUO ORDER BY CODE_UO";
            $arrayReq[':codeSte'] = $code_ste;
        }
        
        $uofille = $this->pdo->prepare($sql);
        $uofille->execute($arrayReq);

        $return = $uofille->fetchAll($this->pdo::FETCH_ASSOC);
        if ($return) {
            return $return;
        } else {
            return [];
        }
    }
}
