<?php

namespace Lc\ShopBundle\Services ;

use ConnectHolland\CookieConsentBundle\Cookie\CookieChecker;
use Doctrine\ORM\EntityManagerInterface;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Symfony\Component\HttpFoundation\Cookie ;
use Lc\ShopBundle\Context\VisitorInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpFoundation\RequestStack;

class UserUtils
{
        protected $parameterBag ;
        protected $em ;
        protected $utils ;
        protected $requestStack ;
        protected $visitorRepository ;
        protected $merchantUtils ;
        protected $cookieChecker ;

        public function __construct(ParameterBagInterface $parameterBag, EntityManagerInterface $em, Utils $utils,
                                    RequestStack $requestStack, MerchantUtilsInterface $merchantUtils, CookieChecker $cookieChecker)
        {
                $this->em = $em ;
                $this->parameterBag = $parameterBag ;
                $this->utils = $utils ;
                $this->requestStack = $requestStack ;
                $this->visitorRepository = $this->em->getRepository($this->em->getClassMetadata(VisitorInterface::class)->getName()) ;
                $this->merchantUtils = $merchantUtils ;
                $this->cookieChecker = $cookieChecker ;
        }

        public function getCookieNameVisitor()
        {
                return $this->parameterBag->get('app.cookie_name_visitor') ;
        }

        public function cryptCookie($data)
        {
                return base64_encode($data);
        }

        public function decryptCookie($data)
        {
                return base64_decode($data);
        }

        public function setCookieVisitor($response, $cookie)
        {
                $response->headers->setCookie(Cookie::create($this->getCookieNameVisitor(), $this->cryptCookie($cookie), 0, '/', $this->utils->getCookieDomain()));
        }

        public function getVisitor($cookie)
        {
                return $this->visitorRepository->findOneBy(['cookie' => $cookie]) ;
        }

        public function getVisitorCurrent()
        {
                $cookie = $this->requestStack->getCurrentRequest()->cookies->get($this->getCookieNameVisitor()) ;
                return $this->getVisitor($cookie) ;
        }

        public function addVisitor($cookie, $ip)
        {
                $classVisitor = $this->em->getClassMetadata(VisitorInterface::class)->getName() ;
                $visitor = new $classVisitor ;

                $visitor->setCookie($cookie) ;
                $visitor->setIp($ip) ;
                $visitor->setTotalVisit(1) ;
                $visitor->setLastAccess(new \DateTime()) ;

                $this->em->persist($visitor);
                $this->em->flush() ;
        }

        public function updateVisitor($visitor)
        {
                $totalVisit = $visitor->getTotalVisit() + 1 ;
                $visitor->setTotalVisit($totalVisit) ;
                $visitor->setLastAccess(new \DateTime()) ;

                $this->em->persist($visitor);
                $this->em->flush() ;
        }

        public function setNewsletter($user, $subscribeNewsletter)
        {
                $currentMerchant = $this->merchantUtils->getMerchantCurrent() ;
                $newsletters = $currentMerchant->getNewsletters() ;

                if(isset($newsletters[0]) && $newsletters[0]) {
                        if($subscribeNewsletter) {
                                $user->addNewsletter($newsletters[0]) ;
                        }
                        else {
                                $user->removeNewsletter($newsletters[0]) ;
                        }
                }

                $this->em->persist($user) ;
                $this->em->flush() ;
        }

}