<?php

namespace PrestaShop\Module\PolarisPrestaTheme\Controllers\Admin;

use Symfony\Component\HttpFoundation\Request;

use PrestaShop\Module\PolarisPrestaTheme\Config\ConfigTheme;
use PrestaShop\Module\PolarisPrestaTheme\Forms\{CategoryType,CategoryGroupType,SliderType,SliderGroupType,ProductHomeType,AboutType,AboutGroupType,BrandType, ProductHomeGroupType, ReassuranceType,ReassuranceGroupType};
use Symfony\Component\HttpFoundation\JsonResponse;

/**
 * AdminHomeBlocksController
 * 
 * Contrôleur pour la configuration des differents blocks present sur la page d'accueil.
 * Permet de gérer les réseaux sociaux, les catégories, les sliders, les nouveaux produits, les produits en promotion, la section "À propos",
 * les éléments de rassurance, la livraison, le bandeau supérieur et les image à mettre en avant.
 * 
 */
class AdminHomeBlocksController extends AdminFormController
{

    /**
     * ConfigurationCategoryAction
     * 
     * Permet au client d'ajouter des catégories avec des images personnalisées sur la page d'accueil
     * 
     * @param Request $request
     * @param int $id L'ID de la catégorie
     * @param string $action Action à effectuer (ajouter, modifier, supprimer)
     */
    public function ConfigurationCategoryAction(Request $request, int $id, $action , $group_id )
    {
        return $this->CreateConfigurationForm(
            $request,
            CategoryType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigCategory', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configCategory', // Nom du tableau
            'admin_presta_show_category', // Redirection après traitement
            true, // L'image doit être uploadée
            'Configuration des visuels par catégorie', // Titre de la page
            null,
            $group_id
        );
    }

    public function ConfigurationCategoryGroupAction(Request $request, $id , $action ){

        return $this->CreateConfigurationForm(
            $request,
            CategoryGroupType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigCategoryGroup', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configCategoryGroup', // Nom du tableau
            'admin_presta_show_category', // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration des visuels par catégorie' // Titre de la page
        );
    }

    /**
     * ShowCategoryAction
     * 
     * Affiche les catégories ajoutées à la configuration
     * 
     */
    public function ShowCategoryAction(int $group_id)
    {
        // Chargement de la configuration
        $config = ConfigTheme::load();

        $group = null;
        foreach ($config->configCategoryGroup as $categoryGroup) {
            if ($categoryGroup->id === $group_id) {
                $group = $categoryGroup;
                break;
            }
        }

        // Retourne la vue avec les catégories configurées
        return $this->render('@Modules/polarisprestatheme/views/templates/admin/show_category.html.twig', [
            'categories' => $group->items,
            'group_id' => $group->id
        ]);
    }



    public function ConfigurationSliderGroupAction(Request $request, $id , $action ){
        return $this->CreateConfigurationForm(
            $request,
            SliderGroupType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigSliderGroup', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configSliderGroup', // Nom du tableau
            'admin_presta_show_slider', // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration des visuels par catégorie' // Titre de la page
        );

    }

    /**
     * ShowSliderAction
     * 
     * Affiche les sliders configurés
     * 
     */
    public function ShowSliderAction(int $group_id)
    {
        // Chargement de la configuration
        $config = ConfigTheme::load();
        

        $group = null;
        foreach ($config->configSliderGroup as $sliderGroup) {
            if ($sliderGroup->id === $group_id) {
                $group = $sliderGroup;
                break;
            }
        }

        // Retourne la vue avec les sliders configurés
        return $this->render('@Modules/polarisprestatheme/views/templates/admin/show_slider.html.twig', [
            'sliders' =>  $group->items,
            'group_id' => $group->id
        ]);
    }

    /**
     * ConfigurationSliderAction
     * 
     * Permet au client d'ajouter ou de modifier un slider
     * 
     * @param Request $request
     * @param int $id L'ID du slider
     * @param string $action Action à effectuer
     */
    public function ConfigurationSliderAction(Request $request, int $id, $action ,$group_id)
    {
        return $this->CreateConfigurationForm(
            $request,
            SliderType::class, // Type de formulaire pour les sliders
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigSlider', // Classe de configuration
            $id, // ID du slider
            $action, // Action à effectuer
            'configSlider', // Nom du tableau
            'admin_presta_show_slider', // Redirection après traitement
            true, // L'image doit être uploadée
            'Configuration du Diaporama', // Titre de la page
            null,
            $group_id
        );
    }



    /**
     * ConfigurationPromotionProduitAction
     * 
     * Permet au client de configurer le block produit en promotion
     * 
     * @param Request $request
     */
    public function ConfigurationProductHomeAction(Request $request, int $id, $action ,$group_id)
    {
        return $this->CreateConfigurationForm(
            $request,
            ProductHomeType::class, // Type de formulaire pour un produit en promotion
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigProductHome', // Classe de configuration
            $id, // ID du slider
            $action, // Action à effectuer
            'configProductHome', // Nom du tableau
            'admin_presta_home', // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration du block produit', // Titre de la page
            null,
            $group_id
        );
    }

 

    public function ConfigurationProductHomeGroupAction(Request $request, $id , $action ){
        
        if($action == "delete"){
            $redirectRoute = "admin_presta_home";
        }else{
            $redirectRoute = "admin_presta_product_home";
        }
        
        return $this->CreateConfigurationForm(
            $request,
            ProductHomeGroupType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigProductHomeGroup', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configProductHomeGroup', // Nom du tableau
            $redirectRoute, // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration du block produit' // Titre de la page
        );

    }

    

    /**
     * ConfigurationAboutAction
     * 
     * Permet au client de configurer la section "À propos"
     * 
     * @param Request $request
     */
    public function ConfigurationAboutAction(Request $request, int $id, $action ,$group_id)
    {
        return $this->CreateConfigurationForm(
            $request,
            AboutType::class, // Type de formulaire pour les sliders
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigAbout', // Classe de configuration
            $id, // ID du slider
            $action, // Action à effectuer
            'configAbout', // Nom du tableau
            'admin_presta_home', // Redirection après traitement
            true, // L'image doit être uploadée
            'Configuration du block about', // Titre de la page
            null,
            $group_id
        );
    }


    public function ConfigurationAboutGroupAction(Request $request, $id , $action ){
        
        if($action == "delete"){
            $redirectRoute = "admin_presta_home";
        }else{
            $redirectRoute = "admin_presta_about";
        }
        
        return $this->CreateConfigurationForm(
            $request,
            AboutGroupType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigAboutGroup', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configAboutGroup', // Nom du tableau
            $redirectRoute, // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration du block about' // Titre de la page
        );

    }


    /**
     * ShowReassuranceAction
     * 
     * Affiche les informations de rassurance configurées
     * 
     */
    public function ShowReassuranceAction(int $group_id)
    {
        // Chargement de la configuration
        $config = ConfigTheme::load();
        

        $group = null;
        foreach ($config->configReassuranceGroup as $reassuranceGroup) {
            if ($reassuranceGroup->id === $group_id) {
                $group = $reassuranceGroup;
                break;
            }
        }


        // Retourne la vue avec les rassurances configurées
        return $this->render('@Modules/polarisprestatheme/views/templates/admin/show_reassurance.html.twig', [
            'reassurances' => $group->items,
            'group_id' => $group->id
        ]);
    }



    public function ConfigurationReassuranceGroupAction(Request $request, $id , $action ){
        
        
        return $this->CreateConfigurationForm(
            $request,
            ReassuranceGroupType::class, // Type de formulaire pour les catégories
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigReassuranceGroup', // Classe de configuration
            $id, // ID de la catégorie
            $action, // Action à effectuer
            'configReassuranceGroup', // Nom du tableau
            'admin_presta_show_reassurance', // Redirection après traitement
            false, // L'image doit être uploadée
            'Configuration deu block reassurance' // Titre de la page
        );

    }


    /**
     * ConfigurationReassuranceAction
     * 
     * Permet au client de configurer les éléments de rassurance
     * 
     * @param Request $request
     * @param int $id L'ID de l'élément de rassurance
     * @param string $action Action à effectuer
     */
    public function ConfigurationReassuranceAction(Request $request, int $id, $action,$group_id)
    {
        return $this->CreateConfigurationForm(
            $request,
            ReassuranceType::class, // Type de formulaire pour la rassurance
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigReassurance', // Classe de configuration
            $id, // ID de la rassurance
            $action, // Action à effectuer
            'configReassurance', // Nom du tableau
            'admin_presta_show_reassurance', // Redirection après traitement
            true, // L'image doit être uploadée
            'Configuration des éléments de Garanties et de services', // Titre de la page
            null,
            $group_id
        );
    }

    
   

    /**
     * ConfigurationBrandAction
     * 
     * Permet au client de configurer le bloc marque (marque a mettre en avant , slider etc ...)
     * 
     * @param Request $request
     */
    public function ConfigurationBrandAction(Request $request, $action){

        return $this->CreateConfigurationForm(
            $request,
            BrandType::class, // Type de formulaire pour le catalogue
            '\PrestaShop\Module\PolarisPrestaTheme\Config\ConfigBrand', // Classe de configuration
            '0', // ID de la configuration
            $action, // Pas d'action spécifique
            'configBrand', // Nom du tableau
            'admin_presta_home', // Pas de redirection spécifique
            null, // Pas d'image à uploader
            'Configuration du bloc Marques partenaires' // Titre de la page
        );
    }

  
    /**
     * ConfigurationBlockPositionAction
     * 
     * Permet au client de configurer la position des blocs sur la page d'accueil
     * 
     */
    public function ConfigurationBlockHomeAction(Request $request)
    {
        $config = ConfigTheme::load();

        

        /* =====================================================
         AJAX SAVE (drag & drop)
        ===================================================== */

        if ($request->isXmlHttpRequest()) {

            $order = json_decode($request->getContent(), true);

            if (!is_array($order)) {
                return new JsonResponse(['success' => false], 400);
            }

            $clean = [];

            foreach ($order as $block) {

                if (!isset($block['type'], $block['ref'])) {
                    continue;
                }

                $clean[] = [
                    'type' => $block['type'],
                    'ref'  => $block['ref'],
                ];
            }

            $config->configBlockHome = $clean;
            $config->save();

            return new JsonResponse(['success' => true]);
        }


        /* =====================================================
         REGISTRY DES BLOCS
        ===================================================== */

        $registry = [
            'category_group' => [
                'configKey'  => 'configCategoryGroup',
                'routeGroup' => 'admin_presta_group_category',
                'route'      => 'admin_presta_show_category',
                'label'      => 'Catégories',
            ],
            'slider_group' => [
                'configKey'  => 'configSliderGroup',
                'routeGroup' => 'admin_presta_group_slider',
                'route'      => 'admin_presta_show_slider',
                'label'      => 'Slider',
            ],
            'product_group' => [
                'configKey'  => 'configProductHomeGroup',
                'routeGroup' => 'admin_presta_group_product_home',
                'route'      => 'admin_presta_product_home',
                'label'      => 'Produits',
            ],

            'brand' => [
                'configKey'  => 'configBrand',
                'routeGroup' => '',
                'route'      => 'admin_presta_brand',
                'label'      => 'Marques',
            ],
            'About_group' => [
                'configKey'  => 'configAboutGroup',
                'routeGroup' => 'admin_presta_group_about',
                'route'      => 'admin_presta_about',
                'label'      => 'A propos de nous',
            ],
            'Reassurance_group' => [
                'configKey'  => 'configReassuranceGroup',
                'routeGroup' => 'admin_presta_group_reassurance',
                'route'      => 'admin_presta_show_reassurance',
                'label'      => 'Reassurance',
            ],
        ];

        /* =====================================================
         INDEXATION DES BLOCS DISPONIBLES
        ===================================================== */

        $availableBlocks = [];

        foreach ($registry as $type => $meta) {

            $key = $meta['configKey'];

            if (empty($config->$key) || !is_array($config->$key)) {
                continue;
            }

            foreach ($config->$key as $ref => $group) {

                if (!$group) {
                    continue;
                }

                $blockKey = $type . '_' . $ref;

                $availableBlocks[$blockKey] = [
                    'type'       => $type,
                    'ref'        => $ref,
                    'label'      => $meta['label'] . ' : ' . ($group->title ?? 'Sans titre'),
                    'isVisible'  => $group->isVisible ?? false,
                    'id'         => $group->id ?? 0,
                    'route'      => $meta['route'],
                    'routeGroup' => $meta['routeGroup'],
                ];
            }

            
        }

        /* =====================================================
         RECONSTRUCTION DE L'ORDRE
        ===================================================== */

        $blocks = [];
        $cleanOrder = [];

        if (!empty($config->configBlockHome)) {

            foreach ($config->configBlockHome as $block) {

                $key = $block['type'] . '_' . $block['ref'];

                if (isset($availableBlocks[$key])) {

                    $blocks[] = $availableBlocks[$key];
                    $cleanOrder[] = $block;

                    unset($availableBlocks[$key]);
                }
            }
        }

        /* =====================================================
         AJOUT DES BLOCS NON POSITIONNÉS
        ===================================================== */

        foreach ($availableBlocks as $block) {
            $blocks[] = $block;
            $cleanOrder[] = [
                'type' => $block['type'],
                'ref'  => $block['ref']
            ];

        }

        /* =====================================================
         NETTOYAGE AUTOMATIQUE
        ===================================================== */

        if ($cleanOrder !== $config->configBlockHome) {
            $config->configBlockHome = $cleanOrder;
            $config->save();
        }

        /* =====================================================
         RENDU
        ===================================================== */

        return $this->render(
            '@Modules/polarisprestatheme/views/templates/admin/show_block_position.html.twig',
            [
                'blocks'   => $blocks,
                'ajax_url' => $this->generateUrl('admin_presta_home'),
            ]
        );
    }

     
}