<?php

namespace OfficeBrain\Bundle\CmsBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
use OfficeBrain\Bundle\SearchBundle\Form\Type\ProductSearchType;
use OfficeBrain\Bundle\SearchBundle\Form\Data\ProductSearchData;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Cache;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;
/**
 * @author OfficeBrain 4494 <info@officebrain.com>
 *
 * Description : CMS Menu controller class
 *
 * @Route("/{_locale}/cms/menu")
 **/
class CmsMenuController extends Controller
{
    protected $request;

    protected $projectSetting;

    protected $cmsMenuManager;

    protected $responseArray;
    
    protected $searchManager;
    
    protected $languageId;
    
    protected $entityManager;

    public function __construct()
    {
        $this->request = null;
        $this->projectSetting = array();
        $this->responseArray = array();
        $this->cmsMenuManager = null;
        $this->searchManager = null;
        $this->languageId = null;
        $this->entityManager = null;
        $this->statsh_cache_wrapper=RedisCacheService::create();
    }

    public function __destruct()
    {
        unset($this->request);
        unset($this->projectSetting);
        unset($this->cmsMenuManager);
        unset($this->responseArray);
        unset($this->searchManager);
        unset($this->languageId);
        unset($this->entityManager);
        unset($this->statsh_cache_wrapper);
    }

    public function initAction()
    {
        $this->request = $this->getRequest();
        $this->projectSetting = $this->request->get('project_setting');
        $this->cmsMenuManager = $this->get('office_brain_cms_menu_manager');
        $this->responseArray = array();
        $this->searchManager = $this->get('office_brain_search_manager');
        $this->languageId = $this->searchManager->getLanguageId();
        $this->entityManager = $this->getDoctrine()->getManager();
    }

    /**
     * @author Employee Id: 4464
     * Description : get product list page as per search criteria.
     *
     * @param 1 :id
     *
     * @return type : Data.
     *
     * @throws Exception: Null
     *
     * @Route("/search-criteria-product-list/{id}", name="office_brain_cmsbundle_cmsmenu_searchcriteriaproductlist",
     * requirements={"id"="\d+"}
     * )
     *
     * @Method("GET")
     * @Template("OfficeBrainCmsBundle:CmsMenu:searchCriteria.html.twig")
     */
    public function searchCriteriaProductListAction()
    {
        $this->initAction();
        
        $criteria = $this->cmsMenuManager->getSearchCriteria();
        $criteria['keyword'] = ($criteria['search_query'])?$criteria['search_query']:'';
        $criteria['categoryId'] = ($criteria['category_filter[]'])?$criteria['category_filter[]']:array();
//         echo "<pre>";print_R($criteria);echo "</pre>";
        
        $productSearchData = new ProductSearchData($this->entityManager, $this->languageId);
        $productSearchForm = new ProductSearchType();
        
        $this->form = $this->createForm($productSearchForm, $productSearchData, array('csrf_protection' => false));
        $this->form->bind($criteria);
        $this->responseArray = $this->searchManager->searchResult($this->form->getData());
        
        if (!$this->request->get('page', null)) {
        	$this->searchManager->setContinueShoppingUrl();
        	$this->responseArray['search_attribute_filter_array'] = $this->searchManager->searchFilter($this->form->getData());
        }
//         echo "<pre>";print_R(\Doctrine\Common\Util\Debug::dump($this->responseArray));echo "</pre>"; die;
        $this->responseArray['filter_criteria'] = $criteria;
        
        return $this->responseArray;
    }

    /**
     * @author Employee Id: 4494
     * Description : menu detail.
     *
     * @param 1 :Menu slug
     *
     * @return type : Data.
     *
     * @throws Exception: Null
     *
     * @Route("/{slug}/{allow_override}", name="office_brain_cmsbundle_cmsmenu_menu",
     * defaults={"slug"="header-menu", "allow_override"=0},
     * options={"expose"=true}
     * )
     *
     * @Method("GET")
     * @Template("OfficeBrainCmsBundle:CmsMenu:menu.html.twig")
     */
    public function menuAction()
    {
		
       // $this->initAction();
        $this->responseArray = array();
        $projectSetting = $this->getRequest()->get('project_setting');
        $locale=$this->getRequest()->getLocale();
        // -----------------------------------------------------------------------
        $cacheMenuKey = array('prepareMenu',$this->getRequest()->get('slug'),$locale,$projectSetting['menu_user_type'],$projectSetting['instance_id'],$projectSetting['user_id'], $this->container->getParameter('kernel.environment'));
        $this->moduleCachePrefix='__MenuManagement__:'.$this->getRequest()->get('slug');
        $cacheKey = $this->moduleCachePrefix.RedisCacheService::generateKey($this->statsh_cache_wrapper,$cacheMenuKey);
        $cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
        if($cacheData){
        	return $cacheData;
        }
        // -----------------------------------------------------------------------
        
        $this->responseArray = $this->get('office_brain_cms_menu_manager')->prepareMenu(false, false, true, true);

        $response = $this->render('OfficeBrainCmsBundle:CmsMenu:menu.html.twig', $this->responseArray);
        
        if(!empty($cacheKey))
        {
        	RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$response);
        }

        //return $this->responseArray;
        return $response;
    }
    
    
}
