<?php
namespace Modules\EtatStatistiques\Controller;

use Entity\Model\EtatStat;
use GuzzleHttp\Psr7\Response;
use Helpers\Outil\Sql;
use Helpers\Trad\Trad;
use Modules\EtatStatistiques\Repository\EtatStatTypeRepo;
use SimpleXMLElement;
use Skeleton\Controller\Controller;

class ExportEtatStatTypeController extends Controller
{
    public function popupExportAction() :string
    {
        $post = $this->request->getParsedBody();
        return $this->renderer->render('@EtatStatistiques/Export/popupExport', [
            'post' => $post,
            'listEtat' => (new EtatStat($this->pdo))->findAll([
                'SOURCE' => 'OXACHARTS_REQ'
            ], [], $post),
        ]);
    }
    
    public function exportAction() :Response
    {
        $id = $this->request->getAttribute('id');
        $post = $this->request->getParsedBody();
        $repo = new EtatStatTypeRepo($this->pdo);

        $list = array_filter($post['listEtat'] ?? [$id]);

        if (empty($list)) {
            $trad = $this->getTranslationService();
            return new Response(400, [], Trad::strBuild(
                $trad->t('Veuillez sélectionner au moins @1@.'),
                $trad->t('un élément')
            ));
        }

        $listEtat = [];
        foreach ($list as $code) {
            $etat = $repo->getEtatDetail($code);
            $etat['ListFilter'] = $repo->loadListChoix($etat['ListFilter']);
            $listEtat[] = $etat;
        }

        $xml = $this->createXml($listEtat);
        return new Response(200, [
            'Content-Disposition' => 'attachment; filename="export_etatstat_'.date('Y_m_d').'.xml"',
            'Content-Type' => 'application/xml; charset=utf-8',
        ], (string) $xml->asXML());
    }

    /**
     * @param array<mixed> $listEtat
     */
    private function createXml(array $listEtat) :\SimpleXMLElement
    {
        
        $root = new SimpleXMLElement(
            '<?xml version="1.0" encoding="utf-8"?><'
            .(count($listEtat) > 1 ? 'ListeEtat' : 'Etat')
            .' />'
        );

        foreach ($listEtat as $etat) {
            $etatXml = $root->getName() == 'Etat'
                ? $root : $root->addChild('Etat');
            
            $etatXml->addChild('CODETAT', $etat['CODETAT']);
            $etatXml->addChild('DESCRIPT', $etat['DESCRIPT']);
            $etatXml->addChild('NOMFIC', $etat['NOMFIC']);
            $etatXml->addChild('SOURCE', 'OXACHARTS_REQ');
            $etatXml->addChild('COMMENTAI', $etat['COMMENTAI']);
            $etatXml->addChild('TYPEREPORT', '');
            $etatXml->addChild('NUMCLIENT', '');
            $etatXml->addChild('ORDRE', '0');
            $etatXml->addChild('TYPERES', $etat['TYPERES']);
            $etatXml->addChild('PERIMETRE', (string) Sql::boolSql($etat['PERIMETRE']));
            
            $requete = $etat['Requete'];

            $reqXml = $etatXml->addChild('ListeREQ_ENT')->addChild('REQ_ENT');
            $reqXml->addChild('REQ_ID', '1');
            $reqXml->addChild('REQ_NOM', $etat['DESCRIPT']);
            $reqXml->addChild('TOP_N', $requete['TOP_N'] ?? '');

            $reqXml->addChild('MEMO_WHERE', $requete['Where'] ?? '');
            $reqXml->addChild('NOM_CHP_PER_SOC', $requete['NOM_CHP_PER_SOC'] ?? '');
            $reqXml->addChild('NOM_CHP_PER_CONF', $requete['NOM_CHP_PER_CONF'] ?? '');

            $reqXml->addChild('REQ_LIBRE', $isLibre = (string) Sql::boolSql($requete['REQ_LIBRE'] ?? false));
            $reqXml->addChild('MEMO_REQ_LIB', $requete['ReqLibre'] ?? '');

            $listSelectXml = $reqXml->addChild('ListeREQ_SELECT');
            foreach ($requete['ListSelect'] ?? [] as $select) {
                $selectXml = $listSelectXml->addChild('REQ_SELECT');
                $selectXml->addChild('ID', $select['ELEM_ID']);
                $selectXml->addChild('NORD', $select['ELEM_NORD']);
                $selectXml->addChild('SQL', $select['ELEM_SQL']);
                $selectXml->addChild('ALIAS', $select['ELEM_ALIAS']);
                $selectXml->addChild('TYPE_DONNEE', $select['RSEL_TYPE_DONNEE']);
                $selectXml->addChild('GRP_BY', $select['ELEM_GRP_BY']);
                $selectXml->addChild('OPE_GRP', $select['ELEM_OPE_GRP']);
                $selectXml->addChild('TYPE_TRI', $select['TYPE_TRI']);
                $selectXml->addChild('ORDRE_TRI', $select['ORDRE_TRI']);
            }

            $listFromXml = $reqXml->addChild('ListeREQ_FROM');
            $listJoin = array_filter(array_merge(
                [$requete['From'] ?? null],
                $requete['ListJoin'] ?? []
            ));
            foreach ($listJoin as $from) {
                $fromXml = $listFromXml->addChild('REQ_FROM');
                $fromXml->addChild('ID', $from['TABLE_ID']);
                $fromXml->addChild('NOM', $from['TABLE_NOM']);
                $fromXml->addChild('ALIAS', $from['TABLE_ALIAS']);
                $fromXml->addChild('TYPE_JOINT', $from['TYPE_JOINT']);
                $fromXml->addChild('CLAUSE_JOINT', $from['CLAUSE_JOINT']);
                $fromXml->addChild('TYPE_TV', 'T');
            }

            $listFilDonXml = $reqXml->addChild('ListeREQ_FILTRES_DON');
            foreach ($requete['ListFilter'] ?? [] as $filter) {
                $filDonXml = $listFilDonXml->addChild('REQ_FILTRES_DON');
                $filDonXml->addChild('CODE', $filter['CODE_FILTRE']);
                $filDonXml->addChild('TYPE', $filter['TYPE_FILTRE']);
                $filDonXml->addChild('NOM_CHP', $filter['NomChamp']);
            }

            $listFilDonXml = $reqXml->addChild('ListeREQ_RUPTURES');
            $rupture = $requete['Rupture'] ?? null;
            if (!empty($rupture)) {
                $rupXml = $listFilDonXml->addChild('REQ_RUPTURES');
                $rupXml->addChild('NUM_ORD', $rupture['NUM_ORD']);
                $rupXml->addChild('NOM_CHP', $rupture['NOM_CHP']);
                $rupXml->addChild('TEXTE_RUP', $rupture['TEXTE_RUP']);
            }

            $listFilDonXml = $reqXml->addChild('ListeREQ_RUPTURES_TOTAUX');
            foreach ($rupture['ListRuptureTot'] ?? [] as $rupTot) {
                $filDonXml = $listFilDonXml->addChild('REQ_RUPTURES_TOTAUX');
                $filDonXml->addChild('NUM_ORD', $rupTot['NUM_ORD']);
                $filDonXml->addChild('NOM_CHP', $rupTot['NOM_CHP']);
                $filDonXml->addChild('OPE_GRP', $rupTot['ELEM_OPE_GRP']);
            }

            unset($reqXml);
            // End of reqXml
            //_________________
            // Back to etatXml

            $option = $etat['Option'] ?? null;
            if ($option) {
                $optionXml = $etatXml->addChild('ListeREQ_OPTIONS')->addChild('REQ_OPTIONS');
                $optionXml->addChild('G_TITRE', $option['G_TITRE']);
                $optionXml->addChild('G_STITRE', $option['G_STITRE']);
                $optionXml->addChild('G_LABELS', (string) Sql::boolSql($option['G_LABELS']));
                $optionXml->addChild('G_DATA', (string) Sql::boolSql($option['G_DATA']));
                $optionXml->addChild('G_MULTITYPEW', (string) Sql::boolSql($option['G_MULTITYPE']));
                $optionXml->addChild('G_TYPE_MONO', $option['G_TYPE_MONO']);
                $optionXml->addChild('X_ALIAS', $option['X_ALIAS']);
                $optionXml->addChild('X_TITRE', $option['X_TITRE']);
                $optionXml->addChild('X_INCLINE', (string) Sql::boolSql($option['X_INCLINE']));
                $optionXml->addChild('Y1_TITRE', $option['Y1_TITRE']);
                $optionXml->addChild('Y1_UNITE', $option['Y1_UNITE']);
                $optionXml->addChild('Y2_AFF', (string) Sql::boolSql($option['Y2_AFF']));
                $optionXml->addChild('Y2_TITRE', $option['Y2_TITRE']);
                $optionXml->addChild('Y2_UNITE', $option['Y2_UNITE']);
                $optionXml->addChild('T_TITRE', $option['T_TITRE']);
                $optionXml->addChild('T_STITRE', $option['T_STITRE']);
            }
            
            $listSerieXml = $etatXml->addChild('ListeREQ_SERIES');
            foreach (($etat['ListSerie'] ?? []) as $serie) {
                $serieXml = $listSerieXml->addChild('REQ_SERIES');
                $serieXml->addChild('ID', $serie['SERIE_ID']);
                $serieXml->addChild('ALIAS', $serie['SERIE_ALIAS']);
                $serieXml->addChild('NOM', $serie['SERIE_NOM']);
                $serieXml->addChild('TYPE_GRAPH', $serie['TYPE_GRAPH']);
                $serieXml->addChild('NUM_AXE', $serie['NUM_AXE']);
                $serieXml->addChild('COLOR', $serie['SERIE_COLOR']);
            }
            
            $listSerieXml = $etatXml->addChild('ListeREQ_FILTRES');
            foreach ($etat['ListFilter'] as $filtre) {
                $filtreXml = $listSerieXml->addChild('REQ_FILTRES');
                $filtreXml->addChild('TYPE', $filtre['TYPE_FILTRE']);
                $filtreXml->addChild('CODE', $filtre['CODE_FILTRE']);
                $filtreXml->addChild('LIB', $filtre['LIB_FILTRE']);
                $filtreXml->addChild('TYPE_CHP', $filtre['TYPE_CHP_FILTRE']);
                $filtreXml->addChild('TYPE_DON', $filtre['TYPE_DON_FILTRE']);

                if ($filtre['TYPE_FILTRE'] == 'USER') {
                    $fentXml = $filtreXml->addChild('ListeFILT_ENT')->addChild('FILT_ENT');
                    $fentXml->addChild('LIB', $filtre['FENT_LIB_FILTRE']);
                    $fentXml->addChild('TYPE_DONNEE', $filtre['FENT_TYPE_DONNEE']);
                    $fentXml->addChild('BASE_DE_DONNEE', $filtre['FENT_BASE_DE_DONNEE']);
                    $fentXml->addChild('TYPE_AFFICHAGE', $filtre['FENT_TYPE_AFFICHAGE']);
                    $fentXml->addChild('IND_SAISIE_LIBRE', (string) Sql::boolSql($filtre['FENT_IND_SAISIE_LIBRE']));
                    $fentXml->addChild('MEMO_REQ_LIB', $filtre['ReqLibre']);
                    $fentXml->addChild('MEMO_WHERE', '');
                    $fentXml->addChild('IND_PERIMETRE', (string) Sql::boolSql($filtre['FENT_IND_PERIMETRE']));
                    $fentXml->addChild('NOM_CHP_PER_SOC', $filtre['FENT_NOM_CHP_PER_SOC']);
                    $fentXml->addChild('NOM_CHP_PER_CONF', $filtre['FENT_NOM_CHP_PER_CONF']);
                    $listChoixXml = $fentXml->addChild('ListeFILT_LISTE');
                    foreach (($filtre['ListChoix'] ?? []) as $choix) {
                        $choixXml = $listChoixXml->addChild('FILT_LISTE');
                        $choixXml->addChild('ID', $choix['FLIS_ID']);
                        $choixXml->addChild('NO_ORDRE', $choix['FLIS_NO_ORDRE']);
                        $choixXml->addChild('VALEUR', $choix['FLIS_VALEUR']);
                        $choixXml->addChild('LIBELLE', $choix['FLIS_LIBELLE']);
                    }
                }
            }
        }
        
        return $root;
    }
}
