<?php

namespace OfficeBrain\Bundle\AccessManagementBundle\Listener;

use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManager;
use Symfony\Component\HttpKernel\Kernel;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\Security\Core\SecurityContext;
use Symfony\Component\HttpKernel\HttpKernelInterface;
use Symfony\Bundle\FrameworkBundle\Templating\EngineInterface;

use OfficeBrain\Bundle\AccessManagementBundle\Listener\AccessConfigurationListener as BaseAccessConfigurationListener;

class ExceptionListener extends BaseAccessConfigurationListener {
	protected $exceptionArray = array('401'=>'Unauthorized','400'=>'Bad Request','403'=>'Forbidden','404'=>'Not Found','500'=>'Internal Server Error');
	public function __construct(EngineInterface $templating, EntityManager $entityManager, Kernel $kernel, SecurityContext $context) {
		parent::__construct ( $kernel, $entityManager, $context );
		$this->templating = $templating;
		$this->emailManager = $this->serviceContainer->get ( 'office_brain_email_service' );
	}
	public function onKernelException(GetResponseForExceptionEvent $event) {
		$exception = $event->getException ();
		
		if (strstr ( $exception, "MongoConnectionException" )) {
			// new Response object
			$response = new Response ( '', 403 );
			$params = $exception;
			$this->emailManager->send ( 'dhvani@officebrain.com', 'bthakkar@officebrain.com', "Exception occured : while connecting to mongo db", $params );
			
			$this->request = $event->getRequest ();
			if ($this->request->getLocale () == "en_us") {
				echo "Service is temporarily unavailable.";
			} else {
				echo "Le service est temporairement indisponible.";
			}
			$event->setResponse ( $response );
		}
		
		$masterRequest = $this->serviceContainer->get ( 'request_stack' )->getMasterRequest ();
		if (HttpKernelInterface::MASTER_REQUEST !== $event->getRequestType ()) {
			$this->request = $event->getRequest ();
			
			if (! empty ( $masterRequest ) && $masterRequest instanceof Request) {
				$rule_array ['project_setting'] = $masterRequest->get ( 'project_setting' );
				$rule_array ['project_user_setting'] = $masterRequest->get ( 'project_user_setting' );
				$this->request->attributes->add ( $rule_array );
			}
			return;
		}
		$this->PrepareAccessAndConfigurationRulesForException ( $event );
		
		// provide the better way to display a enhanced error page only in prod environment, if you want
		//if ('prod' == $this->kernel->getEnvironment ()) {
			// exception object
			// new Response object
			$response = new Response ();
			// set response content
			$response->setContent ( 
					// create you custom template AcmeFooBundle:Exception:exception.html.twig
					$this->templating->render ( $masterRequest->get ( 'project_setting' )['instance_theme_path'] . ':' . $masterRequest->get ( 'project_setting' )['instance_theme'] . '/Exception:error.html.twig', array (
							'status_code' => '', //$exception->getStatusCode (),
							'status_message' => '', //$this->exceptionArray [$exception->getStatusCode ()] 
					) ) );
			
			// HttpExceptionInterface is a special type of exception
			// that holds status code and header details
			if ($exception instanceof HttpExceptionInterface) {
				$response->setStatusCode ( $exception->getStatusCode () );
				$response->headers->replace ( $exception->getHeaders () );
			} else {
				$response->setStatusCode ( 500 );
			}
			
			// set the new $response object to the $event
			$event->setResponse ( $response );
		//}
	}
}
