<?php
namespace Modules\RechercheArticles\PunchOut;

use Entity\Model\Centre;
use Entity\Model\CFormats;
use Entity\Model\Fourniss;
use Entity\Model\FValDef;
use Entity\Model\Hastutil;
use Entity\Model\OxaUserPanier;
use Entity\Model\SousFamille;
use Helpers\Outil\Outils;
use Helpers\Trad\ITrad;
use Modules\RechercheArticles\PunchOut\PunchOut;
use Skeleton\Router;

class PunchOutOCI extends PunchOut
{
    // Login de connexion
    /**
     * @var string $login
     */
    protected $login;

    // Password de connexion
    /**
     * @var string $password
     */
    protected $password;

    // Numéro du compte utilisé
    /**
     * @var string $num_compte
     */
    protected $num_compte;

    // Identifiant de la société
    /**
     * @var string $id_societe
     */
    protected $id_societe;

    // Version OCI  utilisée
    /**
     * @var string $oci_version
     */
    protected $oci_version;

    public function __construct(\PDO $pdo, Router $router, ITrad $trad, string $id_cat)
    {
        parent::__construct($pdo, $router, $trad, $id_cat);
        
        // Initialisation des propriétés
        $this->login        = $this->info_catalogue['ID_CLI_LOGIN'];
        $this->password     = $this->info_catalogue['ID_SRV_PASSW'];
        $this->num_compte   = $this->info_catalogue['NUMCOMPTE'];
        $this->id_societe   = $this->info_catalogue['ID_SOCIETE'];
        $this->oci_version  = sprintf('%01.1f', $this->info_catalogue['VERSION_OCI']);
    }

    public function getUrlPunchOut() : string
    {
        $centre = new Centre($this->pdo);
        $infoCentre = $centre->find($_SESSION['Session_CodeCtrLivraison']);

        $hastutil = new Hastutil($this->pdo);
        $infoUser = $hastutil->find($_SESSION['Session_Login']);

        $oxaUsers = (new OxaUserPanier($this->pdo))->find(['id_user' => $_SESSION['id_user'], 'id_panier' => $_SESSION['id_panier']]);

        $listeParam = $this->punchOuRepo->getParamPunchOut($this->info_catalogue['IDFORMAT']);

        if (!$listeParam) {
            if (false !== stripos($this->url_connexion_po, '?')) {
                $this->url_connexion_po = $this->url_connexion_po . '&';
            } else {
                $this->url_connexion_po = $this->url_connexion_po . '?';
            }
            
            $this->url_connexion_po .= "USERNAME={$this->login}";
            $this->url_connexion_po .= "&PASSWORD={$this->password}";
            $this->url_connexion_po .= "&account={$this->num_compte}";
            $this->url_connexion_po .= "&company={$this->id_societe}";
            $this->url_connexion_po .= "&OCI_VERSION={$this->oci_version}";
            $this->url_connexion_po .= "&DPT={$infoCentre['CPOSTAL']}";
            $this->url_connexion_po .= '&HOOK_URL=' . ($this->url_retour_oxaproc);
        } else {
            foreach ($listeParam as $param) {
                if (false !== stripos($this->url_connexion_po, '?')) {
                    $this->url_connexion_po = $this->url_connexion_po . '&';
                } else {
                    $this->url_connexion_po = $this->url_connexion_po . '?';
                }
                
                if ($param['TYPE_PARAM']=='DYNAMIQUE') {
                    if (substr($param['VALEUR_PARAM'], 0, 9) == 'HASTUTIL.') {
                        $champ = substr($param['VALEUR_PARAM'], 9);
                        $value = $infoUser[$champ];
                        $this->url_connexion_po .= "{$param['NOM_PARAMETRE']}={$value}";
                    } elseif (str_starts_with($param['VALEUR_PARAM'], 'oxa_users_panier')) {
                        $explode = explode('.', $param['VALEUR_PARAM']);
                        $explode[1] = $explode[1]=='CENTRE_EMETTEUR'? 'OUPA_CENTRE_EMETTEUR':$explode[1];
                        $value = $oxaUsers[$explode[1]]??'';
                        if ($value) {
                            $this->url_connexion_po .= "{$param['NOM_PARAMETRE']}={$value}";
                        }
                    } elseif ($param['NOM_PARAMETRE']=='USERNAME' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->login}";
                    } elseif ($param['NOM_PARAMETRE']=='PASSWORD' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->password}";
                    } elseif ($param['NOM_PARAMETRE']=='account' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->num_compte}";
                    } elseif ($param['NOM_PARAMETRE']=='company' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->id_societe}";
                    } elseif ($param['NOM_PARAMETRE']=='OCI_VERSION' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->oci_version}";
                    } elseif ($param['NOM_PARAMETRE']=='DPT' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$infoCentre['CPOSTAL']}";
                    } elseif ($param['NOM_PARAMETRE']=='HOOK_URL' && $param['VALEUR_PARAM']!='') {
                        $this->url_connexion_po .= "{$param['VALEUR_PARAM']}={$this->url_retour_oxaproc}";
                    }
                } else {
                    $this->url_connexion_po .= "{$param['NOM_PARAMETRE']}={$param['VALEUR_PARAM']}";
                }
            }
        }

        return $this->url_connexion_po;
    }

    /**
     * @param array<mixed> $content
     * @return void
     */
    public function parseRetour($content):void
    {
        $listeChamps = $content;
        // On détermine si une transcodification existe sur le format du catalogue PunchOut
        $info_catalogue = $this->info_catalogue;
        $idFormat       = $info_catalogue['IDFORMAT'];

        $punchoutRepo   = (new \Modules\RechercheArticles\Repository\Punchout($this->pdo));
        $resultFmt      = $punchoutRepo->getParamField($idFormat);
        $QteCondBDD     = $punchoutRepo->getQteCond($idFormat);
        $racineXML      = (new CFormats($this->pdo))->find($idFormat, ['RACINEXML'])['RACINEXML'];

        if (count($resultFmt) > 0 && $resultFmt[0]['ELEM_XML'] != '') {
            $rechMot = preg_split("/[\[\]\(\)]/", $resultFmt[0]['ELEM_XML'])[0]??'';
            // On va se baser sur le premiere element qui normalement à donc un nom dans ELEM_XML
            $retour = $listeChamps;// NE PAS METTRE DE REFERENCE UNE COPIE MEMOIRE EST VOULU
            foreach ($retour as $champ => & $listeItems) {
                if (strpos($champ, 'NEW_ITEM-LONGTEXT_') === 0) {
                    // Decoupage vis à vis du caratère ':'
                    $liste = explode(':', $champ);
                    $element = explode('_', $liste[0]); // Le dernier morceau de element va contenir le numéro de ligne
                    $numLigne = $element[count($element) - 1];
                    
                    // On regenere un element de plus dans les tableau
                    $listeChamps['NEW_ITEM-LONGTEXT_n:132'][$numLigne] = $listeItems[0];
                }
            }
            
            $ligne = [];
            // On va se baser sur le premiere element qui normalement à donc un nom dans ELEM_XML
            foreach ($listeChamps as $champ => & $listeItems) {
                $rechMotSource = preg_split("/[\[\]\(\)]/", $champ)[0]??'';
                
                // Danger : probleme car normalement c'est NEW_ITEM-VENDOR[n] mais la c'est NEW_ITEM-VENDORMAT[0] voila pourquoi quelque fois ca bug, es que c'est le fournisseur qui doit modififer sont flus ou autre ?
                if ($rechMotSource == $rechMot) {
                    if (is_array($listeItems)) {
                        // Cette donnée n'est pas connu autrement que par l'outil punchOut
                        foreach ($listeItems as $noItem => $valueItem) {
                            $QteCond = null;
                            if ($QteCondBDD) {
                                $rechMotEncours = preg_split("/[\[\]\(\)]/", $QteCondBDD['ELEM_XML'])[0]??'';
                                $QteCond = (float)Outils::formatMontantExcel($listeChamps[$rechMotEncours][$noItem]);
                            }
                            
                            $ligne['qte'] = $listeChamps['NEW_ITEM-QUANTITY'][$noItem];
                            
                            $this->initLigne($ligne);
                            $qteCondActif = false;
                            foreach ($resultFmt as & $value) {
                                if ($this->lexique[$value['TDBNAME']]??'') {
                                    $infoLexique = $this->lexique[$value['TDBNAME']];
                                    // Mise en place de la valeur par defaut s'il le faut
                                    // SURTOUT PAS METTRE A BLANC Sinon perte du code four $ligne[$infoLexique] = "";
                                    if ($value['VALDEFAUT'] == 1) {
                                        $valueDefault = (new FValDef($this->pdo))->find([
                                            'IDFORMAT'  => $idFormat,
                                            'Ligne'     => $value['LIGNE'],
                                        ]);
                
                                        if ($valueDefault) {
                                            $ligne[$infoLexique] = $valueDefault['Valeur_par_defaut'] . $valueDefault['VALEUR_PAR_DEFAUT'];
                                        }
                                    }


                                    
                                    if ($racineXML) {
                                        $ligne['ID_EXTERNE'] = preg_split("/[\[\]\(\)]/", $listeChamps[$racineXML][$noItem])[0]??'';
                                    }
                                    if ($value['ELEM_XML'] != '') {
                                        $rechMotEncours = preg_split("/[\[\]\(\)]/", $value['ELEM_XML'])[0]??'';

                                        if ($value['RATTRIBUT'] == 'A' || $value['RATTRIBUT'] == 'U') {
                                            if (is_numeric($value['RFORMAT']) && $value['TRANSCOD'] != 1) {
                                                $ligne[$infoLexique] = mb_substr($listeChamps[$rechMotEncours][$noItem], 0, (int)$value['RFORMAT']);
                                            } else {
                                                $ligne[$infoLexique] = $listeChamps[$rechMotEncours][$noItem];
                                            }
                                        } else {
                                            $valueFloat = (float)Outils::formatMontantExcel($listeChamps[$rechMotEncours][$noItem]);

                                            if ($value['DIVISEUR']=='-1' && $QteCond) {
                                                if ($infoLexique=='PRIXBASE' || $infoLexique=='PRIXNET' || $infoLexique == 'PX_ART') {
                                                    $ligne[$infoLexique] = $valueFloat / $QteCond;
                                                } elseif ($infoLexique=='CONDITNT') {
                                                    $ligne['qte'] = $ligne['qte'] / $QteCond;
                                                } else {
                                                    $ligne[$infoLexique] = $valueFloat / $QteCond;
                                                }
                                                
                                                $qteCondActif = true;
                                            } elseif ($value['DIVISEUR']!='0') {
                                                $ligne[$infoLexique] = $valueFloat / floatval($value['DIVISEUR']);
                                            } else {
                                                $ligne[$infoLexique] = $valueFloat;
                                            }
                                        }
                                        
                                        if ($value['TRANSCOD'] == 1 && $ligne[$infoLexique]) {
                                            $transco = $punchoutRepo->getTransco($value['TDBNAME'], $this->id_cat, $ligne[$infoLexique]);
                                            if ($transco) {
                                                $ligne[$infoLexique] = $transco['VALREMPLA'];
                                            } else {
                                                $ligne[$infoLexique] = '';
                                            }
                                        }
                                    }

                                    if ($infoLexique == 'COD_FOURN') {
                                        $fournisseur = (new Fourniss($this->pdo))->find($ligne[$infoLexique]);
                                        $ligne['RS_FOURN'] = $fournisseur['RS'];
                                        $ligne['COD_DEV'] = $fournisseur['DEVISE'];
                                    }
                                }
                            }
                            // Il faut recherche maintenant le libelle de la sous famille
                            // Ajout de la notion non visible eproc SPEC 3093 => NVISIPROC 0x46

                            $resultFam = (new SousFamille($this->pdo))->find($ligne['COD_SFAM'], ['DESIGNAT']);
                            if ($resultFam) {
                                $ligne['LIB_SFAM'] = $resultFam['DESIGNAT'];
                            } else {
                                $ligne['LIB_SFAM'] = '';
                            }
                                
                            if ($ligne['CONDITNT'] != '' && $ligne['CONDITNT'] != 0 && $ligne['CONDITNT'] != 1 && !$qteCondActif) {
                                $ligne['qte'] = $ligne['qte'] / $ligne['CONDITNT'];
                                $ligne['TXTCOND'] = $this->trad->t('Cdt de') . ' ' . $ligne['CONDITNT'] . ' ' . $ligne['COD_UNIT'] . ' ' . '(' . $this->trad->t('à') . ' ' . ($ligne['PX_ART'] / $ligne['CONDITNT']) . ' / ' . $ligne['COD_UNIT'] . ')';
                                // OBLIGATOIRE DANS levenshtein(CAS DU PUNCHOUT IL FAUT OBLIGATOIREMENT REMETTE conditionnement à 0
                                $ligne['CONDITNT'] = 0;
                            } else {
                                $ligne['TXTCOND'] = '';
                                $ligne['CONDITNT'] = 0;
                            }
                            
                            if ($ligne['COD_DEV']??'' == '') {
                                $fournisseur = (new Fourniss($this->pdo))->find($ligne['COD_FOURN']);
                                $ligne['RS_FOURN'] = $fournisseur['RS'];
                                $ligne['COD_DEV'] = $fournisseur['DEVISE'];
                            }
                            
                            $listeItemsPanier[] = $ligne;
                        }
                    }
                    break;
                }
            }
        }
        
        $this->listeLigne = $listeItemsPanier??[];
    }
}
