<?php
namespace Modules\GlobalApplication\Controller;

use Skeleton\Controller\Controller;
use Entity\Model\GrillCat;
use Helpers\Trad\Trad;
use Entity\Model\GrillModeEvent;
use Modules\GlobalApplication\Repository\ImportQuestion;

class ImportQuestionController extends Controller
{
    public function treeCampagneList($array)
    {
        $node = array();
        

        foreach ($array as $noeud) {
            $add = array(
                    'id' => $noeud['ID_THEME'],
                    'text' => $noeud['LIB_THEME'],
                    'ID_PERE' => $noeud['ID_PERE'],
                    //   'ordretri' => $noeud['ordretri'],
                );


            if ($add['ID_PERE'] == '') {
                $node[] = $add;
            } else {
                // passage en référence donc pas besoin d'initialiser $node
                $this->add_to_node_by_camp($noeud['ID_PERE'], $node, $add);
            }
        }
        return $node;
    }
                

    // phpcs:ignore
    public function add_to_node_by_camp($child_id, &$structure, $add, $i = 0)
    {
        $i = 0;

        foreach ($structure as & $data) {
            if (isset($data['id'])) {
                if (trim($data['id']) == trim($child_id)) {
                    //array_push($structure, $add['id']);
                    $data['nodes'] = $add['id'];
                    $i++;
                    return;
                }
            }

    
            if (isset($data) && is_array($data)) {
                $this->add_to_node_by_camp($child_id, $data, $add);
            }
        }
    }
    public function treeRayon($array)
    {
        $node = array();

        

        foreach ($array as $noeud) {
            $add = array(
                  'id' => $noeud['ID_THEME'],
                  'text' => $noeud['LIB_THEME'],
                  'ID_PERE' => $noeud['ID_PERE'],
                //   'ordretri' => $noeud['ordretri'],
              );


            if ($add['ID_PERE'] == '') {
                $node[] = $add;
            } else {
                // passage en référence donc pas besoin d'initialiser $node
                $this->add_to_node($noeud['ID_PERE'], $node, $add);
            }
        }
        return $node;
    }
  
    // phpcs:ignore
    public function add_to_node($child_id, &$structure, $add, $i = 0)
    {

        foreach ($structure as & $data) {
            if (isset($data['id'])) {
                if (trim($data['id']) == trim($child_id)) {
                    $data['nodes'][] = $add;
                    $i++;
                    return;
                }
            }
  
            if (isset($data) && is_array($data)) {
                $this->add_to_node($child_id, $data, $add);
            }
        }
    }
    
    // phpcs:ignore
    public function array_filter_and_tags($array)
    {
        $BibQuestQEntity = new \Entity\Model\BibQstTh($this->pdo);
        
        foreach ($array as &$value) {
            if (is_array($value)) {
                $value = $this->array_filter_and_tags($value);
                if (array_key_exists('id', $value)) {
                    $value['tags'] = $BibQuestQEntity->find($value['id'], ['POIDS'], [], $this->pdo::FETCH_ASSOC);
                }
            }
        }
      
        return array_filter($array, function ($val) {
            return ($val || is_numeric($val));
        });
    }

    public function importFromModelAction() : string
    {
        $post = $this->request->getParsedBody();
        $module = $this->request->getAttribute('MODULE');
        $trad = $this->getTranslationService();
    
        if ($module=='campagne') {
            $menuActive= 'Evaluations';
            $menuLeft='Evaluations';
            $titre= $trad->t('Fournisseur');

            $grilleCat = new GrillCat($this->pdo);
            $grilleCat = $grilleCat->fetchAll();
        
            $grillModeEvent = new GrillModeEvent($this->pdo);
            $grillModeEvent = $grillModeEvent->fetchAll();
         
            \Helpers\Ariane\Ariane::generate(3, $trad->t('Import'));
        }

        if ($module=='question') {
            $menuActive= 'Evaluations';
            $menuLeft='Evaluations';
            $titre= $trad->t('Fournisseur');

            $grilleCat = new GrillCat($this->pdo);
            $grilleCat = $grilleCat->fetchAll();
        
            $grillModeEvent = new GrillModeEvent($this->pdo);
            $grillModeEvent = $grillModeEvent->fetchAll();

            \Helpers\Ariane\Ariane::generate(3, $trad->t('Import Question'));
        }

        return $this->renderer->render('@GlobalApplication/ImportQuestion/importFromModel', [
            'menuActive' => $menuActive,
            'grilleCat' => $grilleCat,
            'grillModeEvent' => $grillModeEvent,
            'grillModeEventJsonEncode' => json_encode($grillModeEvent),
            'menuLeft' => $menuLeft,
            "post" => $post,
            'MODULE' => $module,
            'title' =>$titre??'',
            
        ]);
    }
    
    public function importFromQuestionAction() : string
    {
        $module = $this->request->getAttribute('MODULE');

        $model = new ImportQuestion($this->pdo);
        $repositoryBibliotheque = new \Modules\Evaluation\Repository\BibliothequeDeQuestions($this->pdo);
        
        $treeCGCampagne =  $this->treeRayon($model->listeThemeCampagne());
        $treeCGCampagne =  $this->array_filter_and_tags($treeCGCampagne);
        
        $treeCGQuestionnaire =  $this->treeRayon($repositoryBibliotheque->listeTreeQuestion('question'));
        $treeCGQuestionnaire =  $this->array_filter_and_tags($treeCGQuestionnaire);



        foreach ($treeCGCampagne as $ktree => $valtree) {
            $ktree;
            $array_return = [];
            

            if (array_key_exists('id', $valtree)) {
                array_push($array_return, $valtree['id']);
                $j=0;

                if (array_key_exists('nodes', $valtree) && is_array($valtree['nodes'])) {
                    $i = 0;
                    foreach ($valtree['nodes'] as $treeNode) {
                        array_push($array_return, $treeNode['id']);
                        
                        if (array_key_exists('nodes', $treeNode)) {
                            array_push($array_return, $treeNode['nodes'][$i]['id']);
                            $i++;

                            if (count($treeNode['nodes']) -1 ==$i) {
                                break;
                            }
                        }
                    }
                    // if(count($valtree['nodes']) -1 ==$j)
                    // {
                    //     break;
                    // }
                    $j++;
                }
            }
        }


        if ($module) {
        }
        
        $trad = $this->getTranslationService();
        \Helpers\Ariane\Ariane::generate(3, $trad->t('Import Questionnaire'));
        
        return $this->renderer->render('@GlobalApplication/ImportQuestion/importFromQuestionnaire', [
            'treeCGCampagne'        => $treeCGCampagne,
            'treeCGQuestionnaire'   => $treeCGQuestionnaire,
            'levelCampagne'         => count($treeCGCampagne),
            'levelQuestionnaire'    => count($treeCGQuestionnaire),
            'treeQuestJsTraitementQuestionnaire' => json_encode($repositoryBibliotheque->listeTreeQuestion('question')),
            'treeQuestJsTraitementCampagne' => json_encode($model->listeThemeCampagne()),

        ]);
    }
    
    public function ajaxModelRefreshAction() : string
    {
        
        $post = $this->request->getParsedBody();

        $model = new ImportQuestion($this->pdo);
        $listeModel = $model->listeModelByGrillModel($post['GRILLCAT']);
        

       
        return $this->renderer->render('@GlobalApplication/ImportQuestion/ajaxCorpModEvent', [
            "grillModeEvent" => $listeModel,
            'grillModeEventJsonEncode' => json_encode($listeModel),
        ]);
    }
    public function ajaxDetailByModelAction() : string
    {
        
        $post = $this->request->getParsedBody();

        $model = new ImportQuestion($this->pdo);

        
        $treeCG =  $this->treeRayon($model->listeThemeByModel($post['idModelTheme']));
        $treeCG =  $this->array_filter_and_tags($treeCG);

        if (isset($post['idModelTheme']) && $post['idModelTheme'] != '') {
            $listeQuestion = $model->listeQuestion($post['idModelTheme']);
        } else {
            $listeQuestion = $model->listeQuestion();
        }
        
       
        return $this->renderer->render('@GlobalApplication/ImportQuestion/ajaxTreeViewTheme', [
            'treeCG'        => $treeCG                ,
            'liste_gestion' => $listeQuestion         ,
            'level'         => count($treeCG),
        ]);
    }
    // Ce contrôleur va nous permettre de gerer le détail lorsque l'on va cliquer sur une loupe qui se situe dans la liste des questions
    public function ajaxDetailLoupeQuestionAction() : string
    {
        $model = new ImportQuestion($this->pdo);
        $id = $this->request->getAttribute('idQuestion');
        $repositoryBibliotheque = new \Modules\Evaluation\Repository\BibliothequeDeQuestions($this->pdo);
        
        $detailQuestionById =  $model->detailLoupe($id);

        // TODO completer
        $liste_assoc = $repositoryBibliotheque->listeAssociation($id);
        

        return $this->renderer->render('@GlobalApplication/ImportQuestion/ajaxDetailQuestion', [
            'blb' => $detailQuestionById,
            'liste_assoc' => $liste_assoc,
            'idQuestion' => $id
        ]);
    }

    public function ajaxTableauRefreshAction() : string
    {
        
        $post = $this->request->getParsedBody();

        $repositoryBibliotheque = new \Modules\Evaluation\Repository\BibliothequeDeQuestions($this->pdo);

        $treeCGQuestionnaire =  $this->treeRayon($repositoryBibliotheque->listeTreeQuestion('question'));
        $treeCGQuestionnaire =  $this->array_filter_and_tags($treeCGQuestionnaire);
        


        if (isset($post['idModelTheme']) && $post['idModelTheme'] != '') {
            $listeQuestion = $repositoryBibliotheque->listeBibliotheque('', $post['idModelTheme'], 'question');
        } else {
            $listeQuestion = $repositoryBibliotheque->listeBibliotheque('', '', 'question');
        }
       
        return $this->renderer->render('@GlobalApplication/ImportQuestion/ajaxTableauRefresh', [
            'liste_gestion'       => $listeQuestion       ,
            'levelQuestionnaire'    => count($treeCGQuestionnaire),
            'treeCGQuestionnaire' => $treeCGQuestionnaire ,
        ]);
    }


    public function popupConfirmationMoveThemeQuestionnaireAction() : string
    {
        $post = $this->request->getParsedBody();

        $type_reponse= 'O';

        $path = '';
        $model = new ImportQuestion($this->pdo);
        
        // Cette ID de campagne va représenter l'élement sur lequel on à drop le theme du questionnaire
        $id_campagne = '';
        // Cette id représente l'id de la question qu'on drag ( venant du questionnaire)
        $id_questionnaire = $post['themeQuestionnaire'];

        foreach ($model->listeThemeCampagne() as $v) {
            if ($v['LIB_THEME'] == $post['texteCampagneFocus']) {
                $id_campagne = $v['ID_THEME'];
            }
        }
        

        // Ici selon le cas de ou on se trouve dans l'arborescence on va conditonner le messages
        switch ($type_reponse) {
            case 'O':
                $path = "path('Evaluation.BibliothequeDeQuestions.OuvertAjaxModifierQuestion')";
                $message = 'Êtes-vous sûr de bien de modifier votre type de réponse en Ouvert ? Ceci causera la perte de toute les données liées a la question.';
                break;
            case 'T':
                $path = "path('Evaluation.BibliothequeDeQuestions.TableauDeReponseAjaxModifierQuestion')";
                $message = 'Êtes-vous sûr de bien de modifier votre type de réponse en Tableau De réponse ? Ceci causera la perte de toute les données liées a la question.';
                break;
            case 'N':
                $path = "path('Evaluation.BibliothequeDeQuestions.NumeriqueAjaxModifierQuestion')";
                $message = 'Êtes-vous sûr de bien de modifier votre type de réponse en Numérique ? Ceci causera la perte de toute les données liées a la question.';
                break;
            case 'C':
                $path = "path('Evaluation.BibliothequeDeQuestions.CalculeAjaxModifierQuestion')";
                $message = 'Êtes-vous sûr de bien de modifier votre type de réponse en Calculé ? Ceci causera la perte de toute les données liées a la question.';
                break;
            case 'L':
                $path = "path('Evaluation.BibliothequeDeQuestions.LogiqueAjaxModifierQuestion')";
                $message = 'Êtes-vous sûr de bien de modifier votre type de réponse en Logique ? Ceci causera la perte de toute les données liées a la question.';
                break;
        }
       
        $div     = 'tableBibliotheque';
        $option  = $post['option']??'';
        $loader  = $post['loader']??false;
        $popup   = $post['popup']??false;

       

        return $this->renderer->render('@Evaluation/BilbliothequeDeQuestions/Ajax-bibliothequeDeQuestions/confirmationSuppressionReponse', [
            'message'       => $message,
            'path'          => $path,
            'div_refresh'   => $div,
            'option'        => $option,
            'loader'        => $loader,
            'popup'         => $popup,
            'type_reponse'  => $type_reponse,
            'id_campagne'   => $id_campagne,
            'id_questionnaire' => $id_questionnaire,
            'form_refresh'  => 'form_question_'
        ]);
    }
}
