<?php

namespace App\Controller;

use Laravolt\Avatar\Avatar;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use App\Entity\User;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Mime\Email;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
use App\Service\SettingsManager;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;

/**
 * @Route("/{_locale}", requirements={ "_locale": "%locale_regex%" })
 */
class SecurityController extends AbstractController
{
    private $avatarBackgrounds = [
        '#f44336',
        '#E91E63',
        '#9C27B0',
        '#673AB7',
        '#3F51B5',
        '#2196F3',
        '#03A9F4',
        '#00BCD4',
        '#009688',
        '#4CAF50',
        '#8BC34A',
        '#CDDC39',
        '#FFC107',
        '#FF9800',
        '#FF5722',
    ];

    /**
     * @Route("/mes-ia/fr/login", name="app_login")
     */
    public function login(AuthenticationUtils $authenticationUtils): Response
    {
        // if ($this->getUser()) {
        //    $this->redirectToRoute('target_path');
        // }

        // get the login error if there is one
        $error = $authenticationUtils->getLastAuthenticationError();
        // last username entered by the user
        //$lastUsername = $authenticationUtils->getLastUsername();

        return $this->render('security/login.html.twig', [
            //'last_username' => $lastUsername, 
            'error' => $error
        ]);
    }

    /**
     * @Route("/logout", name="app_logout")
     */
    public function logout()
    {
        throw new \Exception('This method can be blank - it will be intercepted by the logout key on your firewall');
    }

    /**
     * @Route("/images/avatars/{username}.png", name="user_avatar")
     */
    public function avatarAction($username, Request $request)
    {
        $dir = $this->getParameter('kernel.project_dir') . '/public/images/avatars/';

        if (!file_exists($dir)) {
            mkdir($dir, 0755);
        }

        $avatar = new Avatar([
            'uppercase' => true,
            'backgrounds' => $this->avatarBackgrounds
        ]);

        $avatar
            ->create($username)
            ->save($dir . "${username}.png");

        list($type, $data) = explode(';', (string) $avatar->toBase64());
        list(, $data)      = explode(',', $data);
        $data = base64_decode($data);

        $response = new Response((string) $data);
        $response->headers->set('Content-Type', 'image/png');

        return $response;
    }

    /**
     * @Route("/email", name="app_email")
     */
    public function email(Request $request, MailerInterface $mailer, SettingsManager $settingsManager): Response
    {
        if($request->request->get('valider')){
            $email=$request->request->get('email');
            $user = $this->getDoctrine()->getRepository(User::class)->findOneBy(['email' => $email]);
            if($user){
                $link = $this->generateUrl(
                    'app_reinitialisation', [
                        'id'=>$settingsManager->encryptid($user->getId())
                    ],
                    UrlGeneratorInterface::ABSOLUTE_URL
                );

                $content='
                    <h3>SIG-ODD</h3>
                    <p>Votre mot de passe a été réinitialisé avec succès. Utilisez le lien suivant pour créer un nouveau mot de passe.</p>
                    <a href=" '.$link.' ">Réinitialiser votre mot de passe.</a>';
                    
                    $email = (new Email())
                    ->from('noreply.sigodd@gouv.bj')
                    ->to($user->getEmail())
                    ->subject('Réinitialisation du mot de passe')
                    ->html($content);

                $mailer->send($email);
            }
            return $this->render('security/emailconfirm.html.twig', [
            ]);
        }
        return $this->render('security/email.html.twig', [
        ]);
    }

    /**
     * @Route("/reinitialisation", name="app_reinitialisation", requirements={"id"=".+"}, defaults={"id"=0})
     */
    public function reinitialisation(Request $request, UserPasswordEncoderInterface $passwordEncoder, SettingsManager $settingsManager, $id=0): Response
    {
        //http://localhost/SIGODD/public/fr/reinitialisation?id=G6mjDD%2BmqYC20a0LwyOCp5sDnHLbLygkjCHfzSevi/lsTLMIz/q%2B%2BaPrD24WdisTWojifMqp7%2BNvrXsa%2BW3i1g%3D%3D
        $id = $id ? $settingsManager->decryptid($id) : $id;

        if($request->request->get('valider')){
            if(empty($request->request->all())){
                return $this->render('security/error-reset-password.html.twig', [
                ]);
            }else{
                $id=$request->request->all()['id'];
                $pwd=$request->request->all()['password'];
                $pwd2=$request->request->all()['password2'];
                $user = $this->getDoctrine()->getRepository(User::class)->find($id);
                if($user && $pwd==$pwd2){
                    $user->setPassword(
                        $passwordEncoder->encodePassword(
                            $user,
                            $pwd
                        )
                    );
        
                    $this->getDoctrine()->getManagerForClass(User::class)->persist($user);
                    $this->getDoctrine()->getManagerForClass(User::class)->flush();
    
                    return $this->redirectToRoute('app_login');
                }else{
                    return $this->redirectToRoute('postchangepwd');
                }
    
            }
        }
        
        return $this->render('security/error-reset-password.html.twig', [
            'id' => $id
        ]);
    }
}
