<?php
namespace TwigExtension;

use Twig\Extension\AbstractExtension;
use PDO;
use Twig\TwigFunction;
use Helpers\Trad\ITrad;
use Psr\Container\ContainerInterface;
use Skeleton\Router;
use Helpers\Outil\Roles;

class ButtonExtention extends AbstractExtension
{

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

    public function getFunctions()
    {
        return [
            new TwigFunction('Button', $this->Button(...), [
                'is_safe' => [
                    'html'
                ]
            ]),
            new TwigFunction('ButtonExport', $this->ButtonExport(...), [
                'is_safe' => [
                    'html'
                ]
            ]),
            new TwigFunction('bouttonValidation', $this->bouttonValidation(...), [
                'is_safe' => [
                    'html'
                ]
            ]),
            new TwigFunction('exportEntity', $this->exportEntity(...), [
                'is_safe' => [
                    'html'
                ]
            ]),
        ];
    }
    
    /**
     *
     * @param string $titre             : titre du bouton
     * @param bool|string $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<mixed> $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|string $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>';
    }

    /**
     * Summary of ButtonExport
     * Fonction permettant de généré un button twig simplifié
     * @param string $path          : path de l'export
     * @param array<mixed> $filtre         : les post de la page pour l'export
     * @param mixed $pathinformation
     * @param mixed $pathCreatBatch
     * @param mixed $titre
     * @param array<mixed> $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<mixed> $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, (bool) $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<mixed> $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, (bool) $all, $style);
    }
}
