<?php

namespace App\Controller;

use App\Entity\Contact;
use App\Entity\EditablePage;
// use App\Entity\HomeTopItem;
use App\Form\Type\ClearerType;
use App\Service\Booker;
use Dompdf\Dompdf;
use Dompdf\Options;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends AbstractController
{

    private $booker;

    public function __construct(Booker $booker)
    {
        $this->booker = $booker;
    }

    public function twigEverywhere(Request $request)
    {
        $editables = $this->getDoctrine()
            ->getRepository(EditablePage::class)
            ->findAll();
        return [
            'sectionsHierarchy' => $this->booker->getSectionsHierarchyWithImages(),
            'editablePages' => $editables,
            'route' => $request->get('_route'),
            'ajax' => $request->query->get('isAjax'),
        ];
    }

    public function home(Request $request)
    {
        // $topItems = $this->getDoctrine()
        //     ->getRepository(HomeTopItem::class)
        //     ->findAllOrderedByPosition();
        $homeImagesPath = $this->getParameter('app.path.home_images_upload_path');
        // dump($this->booker->getNews());
        // die();
        return $this->render('home.html.twig', array_merge($this->twigEverywhere($request), [
            'homeImagesPath' => $homeImagesPath,
            // 'topItems' => $topItems,
            'latestItems' => array_slice($this->booker->getNews(), 0, 15),
        ]));
    }

    public function latest(Request $request)
    {
        $homeImagesPath = $this->getParameter('app.path.home_images_upload_path');
        // dump($this->booker->getNews());
        // die();
        return $this->render('latest.html.twig', array_merge($this->twigEverywhere($request), [
            'homeImagesPath' => $homeImagesPath,
            'latestItems' => array_slice($this->booker->getNews(), 0, 15),
        ]));
    }

    public function search(Request $request)
    {
        $q = $request->query->get('q');

        $m = $this->booker->getAllModels();
        foreach ($m as $key => $model) {
            if (strpos(strtolower($model->firstName), strtolower($q)) !== 0 && strpos(strtolower($model->lastName), strtolower($q)) !== 0) {
                unset($m[$key]);
            }
        }
        return $this->render('search.html.twig', array_merge($this->twigEverywhere($request), [
            'q' => $q,
            'm' => $m,
        ]));
    }

    public function list(Request $request, $gender = 'all', $section = 'all')
    {
        list($m, $letters) = $this->booker->getModelsAndLetters($gender, $section);
        return $this->render('list.html.twig', array_merge($this->twigEverywhere($request), [
            'sectionsHierarchy' => $this->booker->getSectionsHierarchyWithImages(),
            'route' => 'models-list', //$routeName = $request->get('_route'),
            'ajax' => $request->query->get('isAjax'),
            'gender' => $gender,
            'section' => $section,
            'm' => $m,
            'letters' => $letters,
        ]));
    }

    public function model(Request $request, string $slug, int $nb)
    {
        $id = $this->booker->getModelIdBySlugAndNb($slug, $nb);
        list($m, $b, $v) = $this->booker->getModelInfoAndBookAndVideos($id);
        return $this->render('model.html.twig', array_merge($this->twigEverywhere($request), [
            'model' => $m,
            'slug' => $slug,
            'nb' => $nb,
            'book' => $b,
            'videos' => $v,
        ]));
    }

    private function pdfCommon(Request $request, string $slug, int $nb, bool $isDual)
    {
        $id = $this->booker->getModelIdBySlugAndNb($slug, $nb);
        list($m, $b, $v) = $this->booker->getModelInfoAndBookAndVideos($id);
        // dump($m);die;
        // dump($b);die;
        // $b = array_merge($b, $b);
        // return $this->render('pdf.html.twig', array_merge($this->twigEverywhere($request), ['m' => $m, 'b' => $b, 'isDual' => $isDual]));
        $svg = base64_encode(file_get_contents('../public/img/pdf/logo.svg'));
        $pdfOptions = new Options();
        $pdfOptions->set('defaultFont', 'Arial');
        $pdfOptions->set('isRemoteEnabled', true);
        $dompdf = new Dompdf($pdfOptions);
        $html = $this->renderView('pdf.html.twig', ['svg' => $svg, 'm' => $m, 'b' => $b, 'isDual' => $isDual]);
        // die($html);
        $dompdf->loadHtml($html);
        $dompdf->setPaper('A4', 'landscape');
        $dompdf->render();
        $name = rawurlencode($m->display);
        $format = $isDual ? 'dual' : 'eight';
        $optionalNb = $nb != 1 ? '-' . $nb : '';
        $dompdf->stream("Book-$name$optionalNb-$format.pdf", [
            "Attachment" => 0,
        ]);
    }

    public function pdfDual(Request $request, string $slug, int $nb)
    {
        return $this->pdfCommon($request, $slug, $nb, true);
    }

    public function pdfEight(Request $request, string $slug, int $nb)
    {
        return $this->pdfCommon($request, $slug, $nb, false);
    }

    public function become(Request $request, \Swift_Mailer $mailer, $lang)
    {

        $contact = new Contact();
        if ($lang == 'fr') {
            $trans = [
                'firstName' => 'Prénom',
                'lastName' => 'Nom',
                'email' => 'Email',
                'height' => 'Taille',
                'age' => 'Âge',
                'placeOfBirth' => 'Ville',
                'portraitImage' => 'Upload Portrait',
                'sideImage' => 'Upload Profil',
                'fullImage' => 'Upload Plein pied',
                'agreed' => 'Les candidats Mannequins reconnaissent qu\'elles/ils ont été dûment informés, qu\'elles/ils ont lu et compris la <a class="no-ajax-link" href="/protection-des-donnees" target="_blank">Politique de confidentialité</a> et qu\'elles/ils acceptent que leurs données personnelles soient transmises à toute personne concernée uniquement dans le cadre de l\'examen de leur candidature',
                'send' => 'Envoyer',
            ];
        } else {
            $trans = [
                'firstName' => 'First name',
                'lastName' => 'Last name',
                'email' => 'Email',
                'height' => 'Height',
                'age' => 'Age',
                'placeOfBirth' => 'City',
                'portraitImage' => 'Upload Portrait',
                'sideImage' => 'Upload Side',
                'fullImage' => 'Upload Full Length',
                'agreed' => 'Les candidats Mannequins reconnaissent qu\'elles/ils ont été dûment informés, qu\'elles/ils ont lu et compris la <a class="no-ajax-link" href="/protection-des-donnees" target="_blank">Politique de confidentialité</a> et qu\'elles/ils acceptent que leurs données personnelles soient transmises à toute personne concernée uniquement dans le cadre de l\'examen de leur candidature',
                'send' => 'Submit',
            ];
        }
        $form = $this->createFormBuilder($contact)
            ->add('firstName', TextType::class, ['label' => $trans['firstName']])
            ->add('lastName', TextType::class, ['label' => $trans['lastName']])
            ->add('age', TextType::class, ['label' => $trans['age']])
            ->add('height', TextType::class, ['label' => $trans['height']])
            ->add('email', TextType::class, ['label' => $trans['email']])
            ->add('placeOfBirth', TextType::class, ['label' => $trans['placeOfBirth']])
            ->add('instagram', TextType::class)
            ->add('clearer', ClearerType::class)
            ->add('portraitImage', FileType::class, ['label' => $trans['portraitImage']])
            ->add('sideImage', FileType::class, ['label' => $trans['sideImage']])
            ->add('fullImage', FileType::class, ['label' => $trans['fullImage']])
            ->add('agreed', CheckboxType::class, ['label' => $trans['agreed']])
            ->add('save', SubmitType::class, ['label' => $trans['send']])
            ->getForm();

        if ($request->isMethod('POST')) {
            $form->handleRequest($request);
            if ($form->isSubmitted() && $form->isValid()) {
                $contact = $form->getData();

                $portraitImageFile = $form['portraitImage']->getData();

                $portraitImageUrl = $sideImageUrl = $fullImageUrl = '';

                if ($portraitImageFile) {
                    $portraitImageUrl = $this->moveUploadedImageAndReturnFilename($portraitImageFile);
                }

                $sideImageFile = $form['sideImage']->getData();
                if ($sideImageFile) {
                    $sideImageUrl = $this->moveUploadedImageAndReturnFilename($sideImageFile);
                }

                $fullImageFile = $form['fullImage']->getData();
                if ($fullImageFile) {
                    $fullImageUrl = $this->moveUploadedImageAndReturnFilename($fullImageFile);
                }

                $imagesFolderUrl = $this->getParameter('email_images_url');

                $message = (new \Swift_Message('Someone wants to become a model'))
                    ->setFrom('info@thefaceparis.com')
                    ->setTo('info@thefaceparis.com')
                    ->setReplyTo($contact->getEmail())
                    ->setBody(
                        $this->renderView(
                            'emails/contact.html.twig',
                            [
                                'firstName' => $contact->getFirstName(),
                                'lastName' => $contact->getLastName(),
                                'email' => $contact->getEmail(),
                                'height' => $contact->getHeight(),
                                'age' => $contact->getAge(),
                                'placeOfBirth' => $contact->getPlaceOfBirth(),
                                'portraitImage' => $imagesFolderUrl . '/' . $portraitImageUrl,
                                'sideImage' => $imagesFolderUrl . '/' . $sideImageUrl,
                                'fullImage' => $imagesFolderUrl . '/' . $fullImageUrl,
                            ]
                        ),
                        'text/html'
                    );
                $mailer->send($message);
            }
        }

        return $this->render('become.html.twig', array_merge($this->twigEverywhere($request), [
            'form' => $form->createView(),
            'lang' => $lang,
        ]));
    }

    public function extra(Request $request, string $slug)
    {
        $editables = $this->getDoctrine()
            ->getRepository(EditablePage::class)
            ->findAll();
        foreach ($editables as $k => $e) {
            if ($slug == $e->getSlug()) {
                return $this->render('simple.html.twig', array_merge($this->twigEverywhere($request), [
                    'route' => 'simple',
                    'slug' => $slug,
                    'name' => $e->getName(),
                    'content' => $e->getContent(),
                ]));
            }
        }
        return $this->redirectToRoute('error404');
    }

    public function error404(Request $request)
    {
        return $this->render('404.html.twig', array_merge($this->twigEverywhere($request), [
            'sectionsHierarchy' => $this->booker->getSectionsHierarchyWithImages(),
            'route' => '404',
            'ajax' => $request->query->get('isAjax'),
        ]));
    }

    protected function moveUploadedImageAndReturnFilename($data)
    {
        $originalFilename = pathinfo($data->getClientOriginalName(), PATHINFO_FILENAME);
        $safeFilename = transliterator_transliterate('Any-Latin; Latin-ASCII; [^A-Za-z0-9_] remove; Lower()', $originalFilename);
        $newFilename = $safeFilename . '-' . uniqid() . '.' . $data->guessExtension();
        $data->move(
            $this->getParameter('email_images_directory'),
            $newFilename
        );
        return $newFilename;
    }
}
