<?php 

namespace OfficeBrain\Bundle\CoreBundle\Controller;

use Symfony\Bundle\TwigBundle\Controller\ExceptionController;
use Symfony\Component\Debug\Exception\FlattenException;
use Symfony\Component\HttpKernel\Log\DebugLoggerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use OfficeBrain\Bundle\AccessManagementBundle\Manager\Service\AccessManagementService;
use Doctrine\ORM\EntityManager;
use Symfony\Bundle\FrameworkBundle\Templating\TemplateReference;


class CustomExceptionController extends ExceptionController
{
	public function __construct(\Twig_Environment $twig, $debug,EntityManager $EntityManager, $container)
	{
		$this->twig = $twig;
		$this->debug = $debug;
		$this->entityManager = $EntityManager;	
		$this->serviceContainer = $container;
	}

/**
     * @param Request $request
     * @param string  $format
     * @param int     $code          An HTTP response status code
     * @param bool    $showException
     *
     * @return string
     */
    protected function findTemplate(Request $request, $format, $code, $showException)
    {
    	$name = $showException ? 'exception' : 'error';
    	if ($showException && 'html' == $format) {
    		$name = 'exception_full';
    	}
    	$showException = false;
    	$instanceData = $this->findInstance($request);
    	
    	$instanceFrontendTheme = $instanceTheme = !empty($instanceData['instance_theme'])?$instanceData['instance_theme']:$this->serviceContainer->getParameter('default_main_instance_theme'); // Set This instance Id in user provider also
    	
    	if (preg_match('/\/admin/',  $request->getRequestUri())) {
    		$instanceTheme = 'AdminTheme';
    	}
    	
    	$instaceThemePath = ($instanceTheme=='DefaultTheme' || $instanceTheme=='AdminTheme' || $instanceTheme=='DefaultCmsTheme' || $instanceTheme=='Ecommerce2Theme' || $instanceTheme=='DefaultEcommerceTheme' || $instanceTheme=='DefaultBlankTheme')?'OfficeBrainThemeBundle':'OfficeBrainCustomBundleThemeBundle';
    	
    	$instanceFrontendThemePath = ($instanceTheme=='DefaultTheme' || $instanceTheme=='DefaultCmsTheme' || $instanceTheme=='Ecommerce2Theme' || $instanceTheme=='DefaultEcommerceTheme' || $instanceTheme=='DefaultBlankTheme')?'OfficeBrainThemeBundle':'OfficeBrainCustomBundleThemeBundle';
    	
    	// For error pages, try to find a template for the specific HTTP status code and format
    	if (!$showException) {
    		#$template = new TemplateReference('TwigBundle', 'Exception', $name.$code, $format, 'twig');
    		$template = new TemplateReference($instaceThemePath, $instanceFrontendTheme.'/Exception', $name.$code, $format, 'twig');
    		if ($this->templateExists($template)) {
    			return $template;
    		}
    	}
    	
    	// try to find a template for the given format
    	#$template = new TemplateReference('TwigBundle', 'Exception', $name, $format, 'twig');
    	$template = new TemplateReference($instaceThemePath, $instanceFrontendTheme.'/Exception', $name.$code, $format, 'twig');
    	if ($this->templateExists($template)) {
    		return $template;
    	}
    	
    	// default to a generic HTML exception
    	$request->setRequestFormat('html');
    	
    	return new TemplateReference('TwigBundle', 'Exception', $showException ? 'exception_full' : $name, 'html', 'twig');
    	
    }
    
    private function findInstance($request)
    {
    	$hostName = (isset($_SERVER['HTTP_X_FORWARDED_HOST']) && $_SERVER['HTTP_X_FORWARDED_HOST']!='')?$_SERVER['HTTP_X_FORWARDED_HOST']:$request->getHost();
    	
    	$subDomain = null;
    	preg_match('/(?:http[s]*\:\/\/)*(.*?)\.(?=[^\/]*\..{2,5})/i', $hostName, $subDomain);
    	if ($hostName!='localhost' && empty($subDomain)) {
    		$hostName = "www.".$hostName;
    	}
    	$accessMasterObj =  AccessManagementService::initFactory($this->entityManager, $request, $request->getSession());
    	$instanceData = $accessMasterObj->getInstanceMasterRepo()->findByDomain($hostName);
    	$arrInstanceData=array();
    	if (!empty($instanceData)) {
    		$arrInstanceData['instance_type']  = $instanceData->getInstanceType();
    		$arrInstanceData['instance_id']    = $instanceData->getId();
    		$arrInstanceData['instance_theme'] = $instanceData->getTheme()->getThemeName();
    		$arrInstanceData['is_main_instance'] = $instanceData->getIsMain() == 1 ? true : false;
    
    		$arrInstanceData['culture_id'] = $instanceData->getCultureId();
    		$arrInstanceData['culture_code'] = $instanceData->getCultureCode();
    		$arrInstanceData['currency_code'] = $instanceData->getCurrencyCode();
    		$arrInstanceData['currency_name'] = $instanceData->getCurrencyName();
    		$arrInstanceData['price_in_decimal'] = $instanceData->getPriceInDecimal();
    		$arrInstanceData['alias_domain'] = $instanceData->getAliasDomain();
    		if (!empty($instanceData->getAllowedCulture())) {
    			$arrInstanceData['allowed_culture'] = explode(',', $instanceData->getAllowedCulture());
    		}
    	}
    
    	return $arrInstanceData;
    }
}
?>
