<?php 
 
namespace App\EventListener; 
 
use Symfony\Component\HttpKernel\Event\RequestEvent; 
use Symfony\Component\DependencyInjection\Container; 
use Symfony\Component\Security\Core\Security; 
use Doctrine\ORM\EntityManagerInterface; 
use App\Utils\TopNavbar; 
use App\Utils\LtsUtils; 
use Symfony\Contracts\Translation\TranslatorInterface; 
 
final class RoutingListener { 
 
    /** 
     * @var Container 
     */ 
    private $container; 
    /** 
     * @var private $ltsUtils; 
     */ 
    private $topNavbar; 
     
    /** 
     * @var private $ltsUtils; 
     */ 
    private $ltsUtils; 
 
    /** 
     * @var private $translator; 
     */ 
    private $translator; 
 
    /** 
     * @var private $security; 
     */ 
    private $security; 
 
    /** 
     * @var private $parameters; 
     */ 
    private $parameters; 
 
    /** 
     * Constructor 
     * 
     * @param Container $container 
     */ 
    public function __construct(Container $container, Security $security, EntityManagerInterface $entityManager, TopNavbar $topNavBar, LtsUtils $ltsUtils, TranslatorInterface $translator) { 
        $this->container = $container; 
        $this->security = $security; 
        $this->em = $entityManager; 
    $this->topNavbar = $topNavBar; 
        $this->ltsUtils = $ltsUtils; 
    $this->translator = $translator; 
        $this->companyId = 1; 
    } 
    /** 
     * 
     * @param RequestEvent $event   Event object 
     */ 
    public function onKernelRequest(RequestEvent $event) { 
    // Set timezone 
    $timezone = $this->container->getParameter('timezone'); 
    
    if($timezone) { 
     date_default_timezone_set($timezone); 
    } 
    // Set default data 
    $this->setDefaultParams(); 
    // Set userdata 
        $user = $this->security->getUser(); 
        if ($user && $user->getId()) { 
            $this->setUserData($user); 
            $this->setTwigVariables(); 
    } 
    // Set company details 
        $this->setCompanyDetails(); 
//    $this->translator->setLocale($this->parameters['app_name']); 
    // Set Top navigation details 
        $this->setTopNavLinks($event); 
//    $request = $event->getRequest(); 
        $this->container->set('contact', $this); 
        // some logic to determine the $locale 
//    $request->setLocale('Asia/Kolkata'); 
    } 
 
    /** 
     * This function is to get contact data from contact object 
     * @param string $key 
     * @return string 
     */ 
    public function get($key) { 
        return $this->parameters[$key]; 
    } 
 
    public function setDefaultParams() { 
        $this->parameters['id'] = ''; 
        $this->parameters['userId'] = ''; 
        $this->parameters['email'] = ''; 
        $this->parameters['firstName'] = ''; 
        $this->parameters['surName'] = ''; 
        $this->parameters['fullName'] = ''; 
        $this->parameters['companyName'] = ''; 
        $this->parameters['roles'] = ''; 
        $this->parameters['profilePic'] = ''; 
        $this->parameters['defaultDateFormat'] = 'd-m-Y h:i:a';  
        $this->parameters['defaultSystemLang'] = 'en'; 
    } 
    /** 
     * This function is to set contact details in contact object 
     * @param object $user 
     */ 
    public function setUserData($user) { 
        $contact = $this->em->getRepository('App:UserProfile')->findOneBy(array('user' => $user->getId())); 
        if ($contact) { 
            $this->parameters['id'] = $contact->getId(); 
            $this->parameters['userId'] = $contact->getUser()->getId(); 
            $this->parameters['email'] = $contact->getUser()->getEmail(); 
            $this->parameters['firstName'] = $contact->getFirstName(); 
            $this->parameters['surName'] = $contact->getLastName(); 
            $this->parameters['fullName'] = $contact->getFirstName() . ' ' . $contact->getLastName(); 
            $this->parameters['companyName'] = $contact->getCompanyName(); 
            $this->parameters['roles'] = $user->getRoles(); 
            $this->parameters['profilePic'] = $contact->getUserProfileImage(); 
        } 
    } 
 
    private function setTopNavLinks($event) { 
        $request = $event->getRequest(); 
        $resArray = $this->topNavbar->getTopNavRoutes($request); 
        $this->container->get('twig')->addGlobal('topnav_data', $resArray); 
    } 
 
    /** 
     * This function is to set contact details in twig object 
     */ 
    private function setTwigVariables() { 
        $this->container->get('twig')->addGlobal('user_data', $this->parameters); 
    } 
 
    /** 
     * This function is to set contact details in twig object 
     */ 
    private function setCompanyDetails() 
    { 
    $companyDetails = $this->em->getRepository('App:Terminology')->getCompanyDetails($this->companyId); 
    $this->parameters['lang'] = $companyDetails && $companyDetails['systemLanguage'] != '' ? $companyDetails['systemLanguage'] : $companyDetails['defaultSystemLang']; 
    $this->parameters['dateTimeformat'] = $this->parameters['defaultDateFormat']; 
    if($companyDetails && $companyDetails['datetimeFormat'] != ''){ 
        $dataTimeFormat = $this->ltsUtils->getAllDateTimeFormats($companyDetails['datetimeFormat']); 
        $this->parameters['dateTimeformat'] = $dataTimeFormat['phpDateTimeFormat']; 
        $this->parameters['dataTimeFormats'] = $dataTimeFormat; 
    } 
    $companyDetails['wo_stages'] = $companyDetails['stageJson'] ? json_decode($companyDetails['stageJson'], true) : $this->ltsUtils->getAllWOStages(); 
    $this->parameters['wo_stages'] = $companyDetails['wo_stages']; 
    $this->container->get('twig')->addGlobal('company', $companyDetails); 
    } 
 
     
 
}