<?php
namespace TwigExtension;

use Helpers\Trad\ITrad;
use Psr\Container\ContainerInterface;
use Skeleton\Router;
use Helpers\Outil\Roles;
use Helpers\Trad\Trad;

class ButtonExtention extends \Twig\Extension\AbstractExtension
{

    private $router;
    private $pdo;
    private ITrad $trad;
    
    public function __construct(Router $router, \PDO $pdo, ContainerInterface $container)
    {
        $this->router = $router;
        $this->pdo = $pdo;
        $this->trad = $container->get(\Helpers\Trad\ITrad::class);
    }

    public function getFunctions()
    {
        return [
            new \Twig\TwigFunction('Button', [
                $this,
                'Button'
            ], [
                'is_safe' => [
                    'html'
                ]
            ]),
            new \Twig\TwigFunction('ButtonExport', [
                $this,
                'ButtonExport'
            ], [
                'is_safe' => [
                    'html'
                ]
            ]),
            new \Twig\TwigFunction('bouttonValidation', [
                $this,
                'bouttonValidation'
            ], [
                'is_safe' => [
                    'html'
                ]
            ]),
            new \Twig\TwigFunction('exportEntity', [
                $this,
                'exportEntity'
            ], [
                'is_safe' => [
                    'html'
                ]
            ]),
        ];
    }
    
    /**
     *
     * @param string $titre             : titre du bouton
     * @param bool $principal           : est ce qu'il est le bouton est bleu (principal) / gris (secondaire)
     * @param string $path              : Path de redirection (pas obligatoire)
     * @param string $onClick           : dans le cas d'un action JS (popup redirection avec post...)
     * @param array $Tabdroit           : tableau des droits d'accès (et d'affichage)
     * @param boolean $all              :
     * @param string $style             : style... mais en réalité c'est plus le nom d'un classe CSS
     * @param bool $lbank               : si true alors l'action s'ouvrira dans un nouvel onglet
     * @param string $id                : id du bouton
     * @param string $designStyle       : style css a ajouté
     * @return string
     */
    
    // phpcs:ignore
    public function Button($titre = '', $principal = '', $path = '', $onClick = '', $Tabdroit = [], $all = true, $style = '', $lbank = '', $id = '', $designStyle = '')
    {
        if ($Tabdroit) {
            $affichage=true;
            foreach ($Tabdroit as $droit) {
                if ($all) {
                    if (!Roles::droitsUtilisateur($this->pdo, $droit)) {
                        $affichage=false;
                        break;
                    }
                } else {
                    if (Roles::droitsUtilisateur($this->pdo, $droit)) {
                        $affichage = true;
                        break;
                    } else {
                        $affichage = false;
                    }
                }
            }

            if (!$affichage) {
                return '';
            }
        }
        
        if ($principal) {
            $principal='principal';
        } else {
            $principal='secondaire';
        }

        if ($path) {
            $path = 'href="'.$path.'" ';
        }
        if ($onClick) {
            $onClick = 'onClick="'.$onClick.'"';
        }
        
        if ($lbank) {
            $lbank='target="_blank"';
        } else {
            $lbank='';
        }

        if ($id!='') {
            $id = 'id="'.$id.'"';
        } else {
            $id = '';
        }

        return '<a style="cursor:pointer;'.$designStyle.'" '.$path.' '.$onClick.' '.$lbank.' class="button '.$principal.' '.$style.'" '.$id.'>'.$titre.'</a>';
    }
    
    /**
     * Fonction permettant de généré un button twig simplifié
     *
     * @param string $path          : path de l'export
     * @param array $filtre         : les post de la page pour l'export
     * @param array $Tabdroit       : array de droit
     * @param bool $all           : ??
     * @param string $style         : style (mais encore du class css plutot que style)
     * @return string
     */
    // phpcs:ignore
    public function ButtonExport($path, $filtre, $pathinformation, $pathCreatBatch, $titre = '', $Tabdroit = [], $all = false, $style = '')
    {
        
        /** @phpstan-ignore-next-line */
        $onClick="exportCSV2('".$path."' , '".$filtre."', '".$pathinformation."' , '".$pathCreatBatch."');";
        
        return ButtonExtention::Button(
            $titre == '' ?
                $this->trad->t('Export') : $titre,
            false,
            '',
            $onClick,
            $Tabdroit,
            $all,
            $style
        );
    }
    
    /**{{ exportEntity('CaEntet', 'filtre_Commande') }}
     *
     * genere un bouton d'export simplifie pour une entity
     *
     * @param string $entity        : entity a exporté
     * @param string& $idForm       : id du form a filtré
     * @param array $Tabdroit       : array de droit
     * @param string $all           : ??
     * @param string $style         : style (mais encore du class css plutot que style)
     * @return string
     */
    public function exportEntity($entity, $idForm, $Tabdroit = [], $all = '', $style = '')
    {
        $onClick="ajaxPopup('".$this->router->generateUri('GlobalApplication.export.popupExport', ['entity' => $entity])."', 'Export', '$idForm', '','', 'modal_export')";
        return ButtonExtention::Button('Export', false, '', $onClick, $Tabdroit, $all, $style);
    }
    
    /**
     * Genere un bouton de validation d'action qui avec redirection (creation d'un objet avec redirection sur ecran de gestion par exemple)
     *
     * @param string $titre         : titre du bouton
     * @param string $path          : path du bouton
     * @param string $form          : id du form (pour récuperé les post)
     * @param array $Tabdroit       : array de droit
     * @param string $all           : ??
     * @param string $style         : style (mais encore du class css plutot que style)
     * @return string
     */
    public function bouttonValidation($titre, $path, $form, $Tabdroit = [], $all = '', $style = '')
    {
        $onClick="ajaxValidationPopupRedirect('".$path."' , '".$form."');";
        return ButtonExtention::Button($titre, true, '', $onClick, $Tabdroit, $all, $style);
    }
}
