<?php 
 
namespace App\Controller; 
 
use DateTime; 
use App\Service\Mailjet; 
use App\Entity\ResetPassword; 
use App\Form\Admin\ResetPasswordType; 
use App\Service\CheckRecaptcha; 
use App\Repository\UserRepository; 
use Doctrine\ORM\EntityManagerInterface; 
use App\Repository\ResetPasswordRepository; 
use App\Service\StaticData; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Routing\Annotation\Route; 
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; 
use Symfony\Component\PasswordHasher\Hasher\UserPasswordHasherInterface; 
 
class ResetPasswordController extends AbstractController 
{ 
    public function __construct(EntityManagerInterface $manager, StaticData $statics) 
    { 
        $this->manager = $manager; 
        $this->statics = $statics->getStaticData(); 
    } 
 
    /** 
     * @Route("/mot-de-passe-oublie", name="reset_password") 
     */ 
    public function index(Request $request, UserRepository $userRepo, CheckRecaptcha $recaptcha): Response 
    { 
        $page = ['title'=>'Mot de passe oublié']; 
 
        #   je check si l'utilisateur est déja connecté ? 
        if ($this->getUser()) { 
            $this->redirectToRoute('home'); 
        } 
 
        #   je check si il email à été soumis pour la récupération de mot de passe 
        if ($request->get('email')) { 
 
            define('SITE_KEY','6Lf6ntcdAAAAAFIFOj0w_4Q3_q8fs-zXu7senO2n'); 
            define('SECRETE_KEY','6Lf6ntcdAAAAAImt18bgJi8ajipSKwPYfIq3RQd3'); 
 
            if ( $recaptcha->check($_POST['reset-recaptcha_response'], SECRETE_KEY) ){ 
 
                $user = $userRepo->findOneByEmail($request->get('email')); 
 
                if ($user) { 
                    #   1 : enregistrer un bdd la demande de reset password 
                    $reset_password = new ResetPassword(); 
                    $reset_password 
                        ->setUser($user) 
                        ->setToken(uniqid("RP")) 
                        ->setCreatedAt(new DateTime()); 
 
                    $this->manager->persist($reset_password); 
                    $this->manager->flush(); 
 
                    #   2 : Envoi d'un mail à l'utilisateur 
                    $mailjet = new Mailjet(); 
                    $mail_content = $this->renderView('admin/components/mail/_reset_password.html.twig', compact('reset_password')); 
                    $mailjet->send("caurettemarc@gmail.com", "gite-colombine.fr", "maximeavril.dev@gmail.com", "Administrateur", 'Mot de passe oublié', $mail_content, false, false, 3367969); 
 
                    $flashbag = [ 
                        'label' => 'success', 
                        'title' => "Demande prise en compte", 
                        'message' => "Un mail vient de vous être envoyer pour la création de votre nouveau mot de passe !", 
                        'footer' => "Vérifiez vos spams" 
                    ]; 
 
                    return $this->render('admin/components/flash/reset_password.html.twig', [ 
                        'data' => $reset_password, 
                        'flashbag' => $flashbag 
                    ]); 
 
                }else { 
                    $flashbag = [ 
                        'label' => 'warning', 
                        'title' => "Erreur...", 
                        'message' => "Oups... il semblerait que l'email saisi ne soit pas valide.", 
                        'footer' => "Assurez vous bien de mettre l'email d'un compte existant..." 
                    ]; 
 
                    return $this->render('admin/components/flash/reset_password.html.twig', [ 
                        'data' => null, 
                        'flashbag' => $flashbag 
                    ]); 
                } 
            }else { 
                $flashbag = [ 
                    'label' => 'warning', 
                    'title' => "Erreur...", 
                    'message' => "Oups... il semblerait que Google ReCaptcha(bloqueur de spam) ait bloqué l'envoi...", 
                    'footer' => "Merci de recommencer l'opération." 
                ]; 
 
                return $this->render('admin/components/flash/reset_password.html.twig', [ 
                    'data' => null, 
                    'flashbag' => $flashbag 
                ]); 
            } 
        } 
 
        return $this->render('admin/reset_password/index.html.twig', [ 
            'statics' => $this->statics['data'], 
            'page' => $page, 
            'page_title' => '<img class="mt-5 mb-3" src="/images/about/logo-admin-dark-h.png">', 
        ]); 
    } 
 
 
    /** 
     * @Route("/modifier-mot-de-passe/{token}", name="update_password") 
     */ 
    public function update($token, Request $request ,ResetPasswordRepository $resetPasswordRepo, UserPasswordHasherInterface $encoder, CheckRecaptcha $recaptcha) 
    { 
        $page = ['title'=>'Nouveau mot de passe']; 
 
        #   je recupère l'action liée a l'utilisateur 
        $reset_password = $resetPasswordRepo->findOneByToken($token); 
 
        #   je verifie que la demande exist 
        if(!$reset_password){ 
            return $this->redirectToRoute('reset_password', [ 
                'error' => "Un problème est servenu... Merci de recommencer l'opération." 
            ]); 
        } 
 
        #   je verifie que la demande est toujours valide (now + 1h) 
        $now = new DateTime(); 
        if ($now > $reset_password->getCreatedAt()->modify('+ 1 hour')) { 
            $this->addFlash( 
                'warning', 
                "Votre demande de mot de passe a expiré, veuillez la renouveller." 
            ); 
 
            return $this->redirectToRoute('reset_password'); 
        } 
 
        #   Rendre une vue avec mot de passe  
        $form = $this->createForm(ResetPasswordType::class); 
        $form->handleRequest($request); 
 
        #   si le form est valid et soumis 
        if ($form->isSubmitted() && $form->isValid()) { 
 
            define('SITE_KEY','6Lf6ntcdAAAAAFIFOj0w_4Q3_q8fs-zXu7senO2n'); 
            define('SECRETE_KEY','6Lf6ntcdAAAAAImt18bgJi8ajipSKwPYfIq3RQd3'); 
 
            if ( $recaptcha->check($_POST['update-recaptcha_response'], SECRETE_KEY) ){ 
                #   je recupère le password 
                $new_pwd = $form->get('new_password')->getData(); 
                //je l'encode 
                $password_encoded = $encoder->hashPassword($reset_password->getUser(), $new_pwd); 
                $reset_password->getUser()->setPassword($password_encoded); 
 
                #   je flush les données 
                $this->manager->flush(); 
 
                #   envoi du mail de confirmation 
                $mailjet = new Mailjet(); 
                $mail_content = $this->renderView('admin/components/mail/_update_password.html.twig', compact('reset_password')); 
                $mailjet->send("caurettemarc@gmail.com", "gite-colombine.fr", "maximeavril.dev@gmail.com", "Administrateur", 'Mot de passe modifié !', false, false, $mail_content, 3367969); 
 
                #   je notifie l'utilisateur Ajax 
                $flashbag = [ 
                    'label' => 'success', 
                    'title' => "Modifier avec succes", 
                    'message' => "Un mail de confirmation vient de vous être envoyer.", 
                    'footer' => "Vous pouvez maintenant vous connecter !", 
                    'link' => "Je me connecte !" 
                ]; 
 
                return $this->render('admin/components/flash/update_password.html.twig', [ 
                    'data' => $reset_password, 
                    'flashbag' => $flashbag 
                ]); 
            }else { 
                $flashbag = [ 
                    'label' => 'warning', 
                    'title' => "Erreur...", 
                    'message' => "Oups... il semblerait que Google ReCaptcha(bloqueur de spam) ait bloqué l'envoi...", 
                    'footer' => "Merci de recommencer l'opération.", 
                    'link' => "Recommencer" 
                ]; 
 
                return $this->render('admin/components/flash/update_password.html.twig', [ 
                    'data' => null, 
                    'flashbag' => $flashbag 
                ]); 
            } 
        } 
 
        return $this->render('admin/reset_password/update.html.twig',[ 
            'form' => $form->createView(), 
            'page' => $page 
        ]); 
    } 
}