<?php 
 
namespace App\EventListener; 
date_default_timezone_set('UTC'); 
 
use App\Entity\PopUpMessage; 
use App\Entity\User; 
use DateTime; 
use Doctrine\ORM\EntityManagerInterface; 
use Psr\Log\LoggerInterface; 
use Scheb\TwoFactorBundle\Security\Authentication\Token\TwoFactorToken; 
use Symfony\Component\HttpFoundation\Session\Session; 
use Symfony\Component\HttpKernel\Event\RequestEvent; 
use Symfony\Component\Routing\RouterInterface; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Core\Authentication\Token\AnonymousToken; 
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface; 
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface; 
 
//use Symfony\Component\Security\Core\Authorization\Voter\AuthenticatedVoter; 
 
class PopUpMessageListener 
{ 
 
 
    /** 
     * @var Session 
     */ 
    private $session; 
 
    /** 
     * @var TokenStorageInterface 
     */ 
    private $tokenStorage; 
 
    /** 
     * @var RouterInterface 
     */ 
    private $router; 
 
    /** 
     * @var AuthorizationCheckerInterface 
     */ 
    private $checker; 
 
    /** 
     * @var LoggerInterface 
     */ 
    private $logger; 
 
    /** 
     * @var EntityManagerInterface 
     */ 
    private $em; 
 
    /** 
     * @var EntityManagerInterface 
     */ 
    private $defaultTimeZone; 
 
 
    /** 
     * SessionIdleHandler constructor. 
     * @param Session $session 
     * @param TokenStorageInterface $tokenStorage 
     * @param RouterInterface $router 
     * @param AuthorizationCheckerInterface $checker 
     * @param LoggerInterface $logger 
     * @param EntityManagerInterface $em 
     * @param String $defaultTimeZone 
     */ 
    public function __construct(Session $session, TokenStorageInterface $tokenStorage, RouterInterface $router, AuthorizationCheckerInterface $checker, LoggerInterface $logger, EntityManagerInterface $em, String $defaultTimeZone) 
    { 
        $this->session = $session; 
        $this->router = $router; 
        $this->checker = $checker; 
        $this->tokenStorage = $tokenStorage; 
        $this->logger = $logger; 
        $this->em = $em; 
        $this->defaultTimeZone = $defaultTimeZone; 
    } 
 
    /** 
     * @param RequestEvent $event 
     */ 
    public function onKernelRequest(RequestEvent $event): void 
    { 
        $nextMessage= null; 
 
//        $this->logger->error("max_idle_time: ".$this->maxIdleTime); 
//        $this->logger->error("master: ".$event->isMasterRequest()); 
//        $this->logger->error("anonymous: ".$this->isAuthenticatedAnonymously()); 
        if (!$event->isMainRequest() 
            || $this->isAuthenticatedAnonymously()) { 
//            $this->logger->error("return"); 
 
            return; 
        } 
//        $this->logger->error("now: " . $event->getRequest()->get("_route")); 
 
        //if current page is the target page (show popup) than return - if no return than loop!!!!!!! 
        if ( 
            $event->getRequest()->get("_route") == "popupmessage_user_show" 
            || 
            $event->getRequest()->get("_route") == "popupmessage_user_save" 
            || 
            $event->getRequest()->get("_route") == "popupmessage_user_detail" 
            || 
            $event->getRequest()->get("_route") == "popupmessage_user_detail_skip" 
        ) { 
            return; 
        } 
        /** @var User $user */ 
        $user = $this->tokenStorage->getToken()->getUser(); 
 
        if ($this->checker->isGranted('ROLE_BACKEND_USER')) { 
            return; 
        } 
        // set time zone 
        if (!defined('_USER_TIMEZONE_')) { 
            if ($user->getTimezone()) { 
                define('_USER_TIMEZONE_', $user->getTimezone()); 
            } else { 
                define('_USER_TIMEZONE_', $this->defaultTimeZone); 
            } 
        } 
        date_default_timezone_set(_USER_TIMEZONE_); 
 
 
 
//        $this->logger->error("USER : " . $user->getId()); 
//        $this->logger->error("TIME : " .$date->format("Y-m-d H:i:s")); 
//        return; 
        //check nextMessage exists 
        //if not exists return!!! 
        $nextMessage = $this->em->getRepository(PopUpMessage::class)->getNext($user); 
        if ($nextMessage == null || empty($nextMessage)) { 
            if ( 
                $user->getLoginCounter() == 1 && 
                $event->getRequest()->get("_route") != "frontend_plan_change" && 
                isset($_COOKIE['plan_register']) 
            ) { 
                $planId = $_COOKIE['plan_register']; 
                unset($_COOKIE['plan_register']); 
                setcookie('plan_register', '', time() - 3600, '/'); 
                $event->setResponse(new RedirectResponse($this->router->generate('frontend_plan_change', ['id' => $planId]))); 
            } 
//            //user logged in more then 3 times 
//            $skipUserDetail = $this->session->get('skipUserDetail'); 
//            if ( 
//                (is_null($skipUserDetail) || $skipUserDetail == false) 
//            && 
//                $user->getLoginCounter() >= 3 
//            ) { 
//                if ( 
//                    ( 
//                        is_null($user->getCustomerDetail()) 
//                    ) 
//                    || 
//                    ( 
//                        (is_null($user->getCustomerDetail()->getCompanyName()) || strlen($user->getCustomerDetail()->getCompanyName()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getVatNumber()) || strlen($user->getCustomerDetail()->getVatNumber()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getStreet()) || strlen($user->getCustomerDetail()->getStreet()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getCity()) || strlen($user->getCustomerDetail()->getCity()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getCountry()) || strlen($user->getCustomerDetail()->getCountry()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getState()) || strlen($user->getCustomerDetail()->getState()) == 0) || 
//                        (is_null($user->getCustomerDetail()->getZipCode()) || strlen($user->getCustomerDetail()->getZipCode()) == 0) 
//                    ) 
//                ) { 
//                    $event->setResponse(new RedirectResponse($this->router->generate('popupmessage_user_detail'))); 
//                } 
//            } 
            return; 
        } 
 
        //nextMessage exists - redirect to show! 
        $event->setResponse(new RedirectResponse($this->router->generate('popupmessage_user_show'))); 
 
    } 
 
    /** 
     * @return bool 
     */ 
    private function isAuthenticatedAnonymously(): bool 
    { 
//        dump($this->tokenStorage->getToken()); 
//        die; 
//        $this->logger->error(serialize($this->tokenStorage->getToken())); 
//        $this->logger->error(is_a($this->tokenStorage->getToken(), AnonymousToken::class)); 
 
        return !$this->tokenStorage->getToken() 
            || 
            is_a($this->tokenStorage->getToken(), AnonymousToken::class) 
            || 
            is_a($this->tokenStorage->getToken(), TwoFactorToken::class) 
            //!$this->checker->isGranted(AuthenticatedVoter::IS_AUTHENTICATED_FULLY) 
 
            ; 
    } 
 
}