<?php

namespace Modules\Panier\Service;

use Entity\Model\Articles;
use Helpers\Outil\Sql;
use Modules\Panier\Repository\ArticlePanier;
use Modules\Panier\Service\RequeteArticle;
use Modules\Panier\Repository\PanierEntete;
use Modules\Panier\Repository\PanierLigne;
use Modules\RechercheArticles\Service\ArticleService;

class ArticleAssocie
{
    /**
     * @var \PDO $pdo
     */
    private $pdo;
    
    /**
     * @var \PDO $pdoOxaFT
     */
    private $pdoOxaFT;

    /**
     * @var array<mixed> $infoLigne
     */
    private $infoLigne;

    /**
     * @var requeteArticle $requeteArticle
     */
    private $requeteArticle;

    /**
     * @var array<mixed> $article_trouve
     */
    private $article_trouve;
    
    /**
     * @param int|string $idLigne
     */
    public function __construct(\PDO $pdo, \PDO $pdoOxaFT, $idLigne)
    {
        $this->pdo = $pdo;
        $this->pdoOxaFT = $pdoOxaFT;

        $panierEntete = new PanierEntete($this->pdo);
        $infoPanier = $panierEntete->getEntetePanier($_SESSION['id_panier'], $_SESSION['id_user']);

        $panierLigne = new PanierLigne($this->pdo);
        $this->requeteArticle = new RequeteArticle(
            $this->pdo,
            $this->pdoOxaFT,
            $_SESSION["Session_Login"],
            $infoPanier['LIV_CTR'],
            $infoPanier['CENTRE_EMETTEUR']
        );

        $this->infoLigne = $panierLigne->getAllLignePanier($_SESSION['id_panier'], $idLigne);
        
        if ($this->infoLigne['type_de_ligne'] == 0) {
            $this->article_trouve = $this->requeteArticle->rechercheArt($this->infoLigne);
        } else {
            $this->article_trouve = $this->infoLigne;
        }
    }

    /**
     * @return array<mixed>
     */
    public function rechercheArticleAssoc()
    {

        if ($this->article_trouve) {
            $articleAssoc = (new ArticlePanier($this->pdo))->getListeArtAssocier($this->article_trouve, $this->infoLigne);
        } else {
            $articleAssoc = [];
        }

        $result = [];
        foreach ($articleAssoc as $element) {
            $rechArt = [];

            if ($element['T_OBJ_ASS'] == 'A') {
                $rechArt['COD_ART'] = $element['ID_OBJ_ASS'];
                $rechArt['COD_FOURN'] = $this->article_trouve['COD_FOURN'];
                if ($rechArt['COD_ART'] != '') {
                    $articleTrouve = false;

                    // 1er essai : cet article existe-t-il chez le même fournisseur?
                    if (($rechArt['COD_FOURN'] ?? '') !== '') {
                        if ($r = $this->requeteArticle->rechercheArt($rechArt)) {
                            $result[] = [
                                'art' => $r,
                                'filtre' => 'HAP',
                                'enr' => $element,
                                'type_ligne' => 0
                            ];
                            $articleTrouve = true;
                        }
                    }
                    // 2ème essai : chez un autre fournisseur?
                    if (! $articleTrouve) {
                        $rechArt['COD_FOURN'] = '';
                        if ($r = $this->requeteArticle->rechercheArt($rechArt)) {
                            $result[] = [
                                'art' => $r,
                                'filtre' => 'HAP',
                                'enr' => $element,
                                'type_ligne' => 0
                            ];
                            $articleTrouve = true;
                        }
                    }
                    if (! $articleTrouve) {
                        // Maintenant on va aller chercer cette information dans sinequa dlibproc
                        // On ca chercher du cote haplus select DESIGN,NVIBOXAP from ARTICLES
                        if ($_SESSION['GLOB_AuthLigneGenerique']) {
                            $info_art_trouve = (new RequeteArticle($this->pdo, $this->pdoOxaFT))->rechercherArtGen(['CODE_ART' => $rechArt['COD_ART']]);
                            
                            if ($info_art_trouve) {
                                $articleEntity = new Articles($this->pdo);
                                if ($info_article = $articleEntity->find($rechArt['COD_ART'])) {
                                    if (!Sql::boolSql($info_article['NVIBOXAP'])) {
                                        $info_article['PROVENANCE'] = 'HAP';
                                        $info_article['COD_ART']    = $info_art_trouve['CODE_ART'];
                                        $info_article['DES_COMP']   = $info_article['DESIGN'];
                                        $info_article['DES_ART']    = $info_art_trouve['DESIGNLG'];
                                        $info_article['COD_UNIT']   = $info_art_trouve['UNITE'];
                                        $info_article['COD_SFAM']   = $info_art_trouve['SSFAM'];
                                        $result[] = [
                                            'art' => $info_article,
                                            'filtre' => 'HAP',
                                            'enr' => $element,
                                            'type_ligne' => 1
                                        ];
                                    }
                                }
                            }
                        }
                    }
                }
            } elseif ($element['T_OBJ_ASS'] == 'C') {
                // Article Catalogue Oxacat : associés à l’article du catalogue oxacat de la ligne
                // ici on doit extraire les ifnormations pour rechercher l'article avec la notion de pipe
                // - Code du catalogue Oxacat - Code article HAPlus - Code fournisseur - Référence fournisseur - Code fabricant - Référence fabricant
                $listeElement = explode('|', $element['ID_OBJ_ASS']);

                $rechArt['ID_CAT']      = $listeElement[0]; // ID_CATAL IDATACATA IDVERCATA
                $rechArt['COD_ART']     = $listeElement[1]; // CODEARTI
                $rechArt['COD_FOURN']   = $listeElement[2]; // CODEFOUR
                $rechArt['REF_FOURN']   = $listeElement[3]; // REFARTFOU
                $rechArt['COD_FAB']     = $listeElement[4]; // FABRICANT
                $rechArt['REF_FAB']     = $listeElement[5]; // REFARTFAB

                if ($r = $this->requeteArticle->rechercheArt($rechArt)) {
                    $result[] = [
                        'art' => $r,
                        'filtre' => 'CAT',
                        'enr' => $element,
                        'type_ligne' => 0
                    ];
                }
            }
        }

        return $result;
    }
}
