<?php

namespace OfficeBrain\Bundle\CmsBundle\Manager\Extended;

use OfficeBrain\Bundle\CmsBundle\Manager\AbstractManager\CmsMenuAbstract as CmsMenuAbstract;
use OfficeBrain\Bundle\CmsBundle\Entity\CmsMenuItem;
use OfficeBrain\Bundle\CmsBundle\Entity\CmsMenuItemLanguage;
use OfficeBrain\Bundle\CmsBundle\Entity\CmsMenuMaster;
use Symfony\Component\HttpFoundation\File\File;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;



class CmsMenuExtended extends CmsMenuAbstract
{
    public function __construct($entityManager, $request, $cmsPageManager, $routerManager, $categoryApiManager, $productTagManager, $searchCriteriaManager, $countries, $languages, $cmsMenuMediaUploadLocation, $userType)
    {
        parent::__construct($entityManager, $request, $cmsPageManager, $routerManager, $categoryApiManager, $productTagManager, $searchCriteriaManager, $countries, $languages, $cmsMenuMediaUploadLocation, $userType);
        
        $this->statsh_cache_wrapper = RedisCacheService::create();
        $this->moduleCachePrefix = '__MenuManagement__';
        
    }

    public function __destruct()
    {
        parent::__destruct();
    }

    public function getMenu()
    {
        $cmsMenu = $this->cmsMenuMasterRepository->find($this->request->get('id'));

        if (!$cmsMenu) {
            return 'CMS_MENU_NOT_FOUND';
        }

        return $cmsMenu;
    }

    public function getMenuBySlug($visibilityFilter = false)
    {
        $cmsMenu = $this->cmsMenuMasterRepository->findBySlug($this->request->get('slug'), $this->countryId, $visibilityFilter);

        if (!$cmsMenu) {
            return 'CMS_MENU_NOT_FOUND';
        }

        return $cmsMenu;
    }

    public function getMenuList()
    {
        return $this->cmsMenuMasterRepository->findByUnique();
    }

    public function prepareMenu($menuSideBar = true, $menuList = true, $buildTree = false, $visibilityFilter = false)
    {
        $data = array();

        $data['menu'] = $this->request->get('id') > 0 ? $this->getMenu() : $this->getMenuBySlug($visibilityFilter);
        
        if ($menuSideBar == true) {
            $data['menuSideBar'] = $this->getMenuSideBar();
        }

        if ($menuList == true) {
            $data['menuList'] = $this->getMenuList();
        }

        $data['countryId'] = $this->countryId;

        $data['languageId'] = $this->languageId;

        $data['mediaLocation'] = $this->cmsMenuMediaUploadLocation['url'];

        if (is_object($data['menu'])) {
            $data['menuId'] = $data['menu']->getId();
        }

        if ($buildTree == true && $data['menu'] != 'CMS_MENU_NOT_FOUND') {
        	$data['menu'] = $this->buildTree($data['menu']->getMenuItemMapping());
        }

        if(false && $menuSideBar == false && $menuList == false){//EMP4464: Need to work on this method In Progress.
            //EMP4464: Please remove false to proceed
            $this->formatMenu($data['menu']);
        }
        
        return $data;
    }
    
    public function prepareMenuMobileApi($siteBaseUrl, $userId=0 ,$menuSideBar = true, $menuList = true, $buildTree = false, $visibilityFilter = false)
    {
    	$data = $this->prepareMenu($menuSideBar, $menuList, $buildTree, $visibilityFilter);
    	
    	$data['menu'] = $this->setMobileApiMenuData($siteBaseUrl, $userId, $data['menu'],$data['languageId'],$data['mediaLocation']);
    	return $data;
    }
    
    private function setMobileApiMenuData($siteBaseUrl, $userId=0, $menuData,$languageId, $mediaLocation, $level=0){
    	$newDataAry = array();
    	foreach ($menuData as $mainMenuId => $menuItem){
    		$thisItemType = $menuItem->getItemType();  		
    		$thisAry = array('menu_id'=>$mainMenuId,'item_type'=>$thisItemType,'reference_id'=>$menuItem->getReferenceId() ,'level'=>$level);
    		
    		$langAry = null;
    		foreach ($menuItem->getLanguageMapping() as $languageData){
    			if($languageData->getLanguageId() == $languageId){
    				$url = $languageData->getUrl();
    				
    				if($url!='javascript:void(0);' && $url!=''){    					
    					if ( strpos($url, $siteBaseUrl) === false ){
    						$url = $siteBaseUrl.$url;
    					}
    				}
    				# set condition if userid<=0 and itemLabel In (Flyers|Order Catalog) then dont displat it.
    				$itemLabel = $languageData->getItemLabel();
    				if( $userId<=0 && ($itemLabel == 'Flyers' || $itemLabel == 'Order Catalog')){
    					break;
    				}
    				
    				$langAry = array('title'=>$languageData->getTitle(),'item_label'=>$itemLabel,'url'=>$url);
    				
    				break;
    			}
    		}
    		$thisAry['language'] = $langAry;
    		
    		if($menuItem->getJsonString()!=null){
    			$ApiSettings = json_decode($menuItem->getJsonString(), true);
    			 
    			foreach ($ApiSettings as $setKey=>$setValue){
    				$thisValue = $setValue;
    				/* if($setKey == 'parameters'){
    				 $newParameters = array();
    				foreach ($thisValue as $parmKey=>$parmValue) {
    				$newParameters[] = array('key'=>$parmKey,'value'=>$parmValue);
    				}$thisValue = $newParameters;
    				} */
    				$thisAry[$setKey] = $thisValue;
    			}
    		}    		  	
    		
    		if( $menuItem->getBackgroundImage() !=''){
    			$thisAry['background_image'] = $siteBaseUrl.$mediaLocation.$menuItem->getBackgroundImage();
    		}
    		
    		if ( isset($menuItem->children) ) {
    			$thisAry['children'] = $this->setMobileApiMenuData($siteBaseUrl, $userId, $menuItem->children,$languageId, $mediaLocation, $level+1);
    		}
    		/* if($level==0){
    			$newDataAry[$mainMenuId] = $thisAry;
    		}else{
    			$newDataAry[] = $thisAry;
    		} */
    		$newDataAry[] = $thisAry;
    	}
    	return $newDataAry;
    }

    public function getMenuSideBar()
    {
        $data = array();
        $countryId = $this->request->get('countryId', $this->countryId);
        $data['CmsPageList'] = $this->cmsPageManager->getCmsActivePageList($countryId);

        $productCategories = array();

        foreach($this->countries as $country) {
        	if ($country['id'] = $countryId && isset($country['language'])) {
        		foreach($country['language'] as $countryLanguage) {
        			$productCategories = array_merge($productCategories, $this->categoryApiManager->getList($this->getLanguageCodeById($countryLanguage).'_'.$this->getCountryCodeById($countryId)));
        		}
        	}
        }

        if (!empty($productCategories)) {
        	$languageProductCategories = $productCategories;

        	unset($languageProductCategories[key($languageProductCategories)]);

        	$data['product_categories'] = $this->buildCategoryTree(current($productCategories), $languageProductCategories, key($productCategories));
        }

        $productTags = $this->productTagManager->getAllTags(array('country_id'=>$countryId, 'language_id'=>$this->languageId));
        if (!empty($productTags)) {
            foreach ($productTags as $tagType => $tags) {
                foreach ($tags as $tagIndex => $tagValues) {
                    $data['product_tags'][] = $tagValues;
                }
            }
        }
        
        $searchCriterias = $this->searchCriteriaManager->getAllSearchCriteriaList($countryId);
        if (!empty($searchCriterias)) {
            foreach ($searchCriterias as $index => $searchCriteria) {
                $data['search_criteria'][] = $searchCriteria;
            }
        }
        
        unset($index);
        unset($countryId);
        unset($productCategories);
        unset($productTags);
        unset($searchCriterias);
        return $data;
    }

    public function setMenuItem()
    {
        $data = array();

        $data['menu'] = $this->getMenu();

        if (is_object($data['menu'])) {
            $data['menuId'] = $data['menu']->getId();
        }

        $data['countryId'] = $this->countryId;

        $data['languageId'] = $this->languageId;

        $data['mediaLocation'] = $this->cmsMenuMediaUploadLocation['url'];

        $menuItem = $this->request->get('menuItem');

        foreach ($menuItem as $item) {
            $cmsMenuItem = new CmsMenuItem();
            $cmsMenuItem->setMenuId($data['menu']);
            $cmsMenuItem->setParentId('0');
            $cmsMenuItem->setSortOrder('0');
            $cmsMenuItem->setItemType($item['menuItemtype']);
            $cmsMenuItem->setReferenceId($item['referenceId']);
            $cmsMenuItem->setCreatedAt(new \DateTime());
            $cmsMenuItem->setCreatedUid($this->projectSetting['user_id']);
            $cmsMenuItem->setVisibility(1);
            $cmsMenuItem->setJsonString($this->createJsonString($item));

            $cmsMenuItem = $this->cmsMenuItemRepository->set($cmsMenuItem);

            $url = isset($item['url']) ? $item['url'] : '';

            if (isset($item['languageId'], $item['title'], $item['slug'])) {
                foreach ($item['languageId'] as $key => $itemLanguage) {
                    switch ($item['menuItemtype']) {

                        case 'page':
                            $title = isset($item['title'][$key]) ? $item['title'][$key] : '';
                            $slug = isset($item['slug'][$key]) ? $item['slug'][$key] : '';
                            if (!empty($slug)) {
                                $url = $this->routerManager->generate('office_brain_cmsbundle_cmspage_page', array('_locale' => $this->getLocateByLanguageId($itemLanguage), 'slug' => $slug));
                            }
                            break;

                        case 'product-category':
                            $title = isset($item['title'][$key]) ? $item['title'][$key] : '';
                            $slug = isset($item['slug'][$key]) ? $item['slug'][$key] : '';
                            $url = $this->routerManager->generate('office_brain_search_bundle_browse_sub_category', array('_locale' => $this->getLocateByLanguageId($itemLanguage), 'category_slug' => $slug));
                            break;

                        case 'category-product-list':
                            $title = isset($item['title'][$key]) ? $item['title'][$key] : '';
                            $slug = isset($item['slug'][$key]) ? $item['slug'][$key] : '';
                            $url = $this->routerManager->generate('office_brain_search_bundle_category_product_list', array('_locale' => $this->getLocateByLanguageId($itemLanguage), 'category_slug' => $slug, 'category_filter[]' => $item['referenceId']));
                            break;
                        case 'browse-category-search':
                        	$title = isset($item['title'][$key]) ? $item['title'][$key] : '';
                            $slug = isset($item['slug'][$key]) ? $item['slug'][$key] : '';
                            $url = $this->routerManager->generate('office_brain_search_bundle_browse_category_search', array('_locale' => $this->getLocateByLanguageId($itemLanguage), 'category_slug' => $slug));
                            break;
                            
                        case 'product-tag':
                        	$title = isset($item['title']) ? $item['title'] : '';
                            $slug = isset($item['slug']) ? $item['slug'] : '';
                            $url = $this->routerManager->generate('office_brain_search_bundle_tag_browse_category', array('_locale' => $this->getLocateByLanguageId($itemLanguage),'tag_name'=>$title,'tag_slug'=>$slug));
                            break;

                        case 'tag-product-list':
                          	$title = isset($item['title']) ? $item['title'] : '';
                           	$slug = isset($item['slug']) ? $item['slug'] : '';
                           	$url = $this->routerManager->generate('office_brain_search_bundle_search', array('_locale' => $this->getLocateByLanguageId($itemLanguage),'tag_id[]'=>strtolower($slug)));
                          	break;

                        /* case 'product-tag-category':
                        	$title = isset($item['title']) ? $item['title'] : '';
                            $slug = isset($item['slug']) ? $item['slug'] : '';
                            $url = $this->routerManager->generate('office_brain_search_bundle_search', array('_locale' => $this->getLocateByLanguageId($itemLanguage),'category_filter[]'=>$item['referenceId'],'tag_filter[]'=>'{tag_id}'));
                            break; */

                        case 'search-criteria':
                            $title = isset($item['title']) ? $item['title'] : '';
                            $slug = '';
                            $url = $this->routerManager->generate('office_brain_cmsbundle_cmsmenu_searchcriteriaproductlist', array('_locale' => $this->getLocateByLanguageId($itemLanguage), 'id' => $item['referenceId']));
                            break;

                        case 'custom':
                            $title = $item['title'];
                            $url = $item['slug'];
                            break;
                            
                        default:
                            $title = $slug = '';
                            break;
                    }

                    $cmsMenuItemLanguage = new CmsMenuItemLanguage();
                    $cmsMenuItemLanguage->setItemId($cmsMenuItem);
                    $cmsMenuItemLanguage->setLanguageId($itemLanguage);
                    $cmsMenuItemLanguage->setItemLabel($title);
                    $cmsMenuItemLanguage->setTitle($title);
                    $cmsMenuItemLanguage->setUrl($url);
                    $this->cmsMenuItemLanguageRepository->set($cmsMenuItemLanguage);

                    $cmsMenuItem->addLanguageMapping($cmsMenuItemLanguage);
                    $data['item_list'][$cmsMenuItem->getId()] = $cmsMenuItem; 
                }
            }
        }
        //$this->statsh_cache_wrapper->removeCacheWithPrifix($this->moduleCachePrefix);
        unset($menuItem);
        unset($data['menu']);

        return $data;
    }

    public function deleteMenuItem($menuItemId = 0, $prepareMenuReturn = true)
    {
    	if ($menuItemId == 0) {
    		$menuItemId = $this->request->get('menu-item-id');
    	}

        $cmsMenuItem = $this->cmsMenuItemRepository->find($menuItemId);

        
        if (!$cmsMenuItem) {
            return 'CMS_MENU_ITEM_NOT_FOUND';
        } else {
        	$cmsMenu = $this->cmsMenuMasterRepository->find($cmsMenuItem->getParentId());

            $this->deleteChildMenuItem($menuItemId);
            $this->cmsMenuItemRepository->remove($cmsMenuItem);
        }

        RedisCacheService::removeCacheByPrefix($this->statsh_cache_wrapper,$this->moduleCachePrefix);

        if ($prepareMenuReturn == true) {
        	return $this->prepareMenu(false, false);
        } else {
        	return $menuItemId;
        }
    }

    public function saveMenuItem()
    {
    	$cmsMenu = $this->getMenu();
    	$data =  json_decode($this->request->get('data'), 'ARRAY');
    	
    	$cmsMenuItemInputs = array();
    	foreach ($data as $menuItem) {
    		$explodeMenuItemName = explode('_', $menuItem['name']);

    		if ($explodeMenuItemName[0] == 'parentId' && $explodeMenuItemName[1] == $menuItem['value']) {
    			continue;
    		}

    		if (count($explodeMenuItemName) == 2) {
    			$cmsMenuItemInputs[$explodeMenuItemName[1]][$explodeMenuItemName[0]] = $menuItem['value'];
    		} elseif (count($explodeMenuItemName) == 3) {
    			$cmsMenuItemInputs[$explodeMenuItemName[1]][$explodeMenuItemName[2]][$explodeMenuItemName[0]] = $menuItem['value'];
    		}
    	}

    	foreach($cmsMenu->getMenuItemMapping() as $menuItem) {

    		if (isset($cmsMenuItemInputs[$menuItem->getId()])) {

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['parentId'])) {
    				$menuItem->setParentId($cmsMenuItemInputs[$menuItem->getId()]['parentId']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['itemType'])) {
    				$menuItem->setItemType($cmsMenuItemInputs[$menuItem->getId()]['itemType']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['referenceId'])) {
    				$menuItem->setReferenceId($cmsMenuItemInputs[$menuItem->getId()]['referenceId']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['cssClasse'])) {
    				$menuItem->setCssClasse($cmsMenuItemInputs[$menuItem->getId()]['cssClasse']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['cssIcon'])) {
    				$menuItem->setCssIcon($cmsMenuItemInputs[$menuItem->getId()]['cssIcon']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['backgroundImage'])) {
    				$menuItem->setBackgroundImage($cmsMenuItemInputs[$menuItem->getId()]['backgroundImage']);
    			}

    			if (isset($cmsMenuItemInputs[$menuItem->getId()]['sortOrder'])) {
    				$menuItem->setSortOrder($cmsMenuItemInputs[$menuItem->getId()]['sortOrder']);
    			}

    			foreach ($menuItem->getLanguageMapping() as $menuItemLanguage) {
    				if (isset($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['itemLabel'])) {
    					$menuItemLanguage->setItemLabel($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['itemLabel']);
    				}

    				if (isset($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['title'])) {
    					$menuItemLanguage->setTitle($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['title']);
    				}

    				if (isset($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['url'])) {
    					$menuItemLanguage->setUrl($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['url']);
    				}

    				if (isset($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['urlTarget'])) {
    					$menuItemLanguage->setUrlTarget($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['urlTarget']);
    				}

    				if (isset($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['description'])) {
    					$menuItemLanguage->setDescription($cmsMenuItemInputs[$menuItem->getId()][$menuItemLanguage->getLanguageId()]['description']);
    				}
    			}
    		}
    	}

    	RedisCacheService::removeCacheByPrefix($this->statsh_cache_wrapper,$this->moduleCachePrefix);

		return $this->cmsMenuMasterRepository->set($cmsMenu);
    }

    public function deleteChildMenuItem($parentId)
    {
        if ($parentId > 0) {
            $cmsMenuItems = $this->cmsMenuItemRepository->findByParentId($parentId);

            if (count($cmsMenuItems) > 0) {
                foreach ($cmsMenuItems as $cmsMenuItem) {
                    if (!$this->deleteChildMenuItem($cmsMenuItem->getId())) {
                        $this->cmsMenuItemRepository->remove($cmsMenuItem);
                    }
                }
            } else {
                return false;
            }
        }
    }

    public function buildTree($elements, $parentId = 0)
    {
        $branch = array();

        foreach ($elements as $element) {
            if ($element->getParentId() == $parentId) {
                $children = $this->buildTree($elements, $element->getId());
                if ($children) {
                    $element->children = $children;
                }

                $branch[$element->getId()] = $element;
            }
        }

        return $branch;
    }

    public function uploadMenuItem()
    {
        $cmsMenuItem = $this->cmsMenuItemRepository->find($this->request->get('id'));

        if (!$cmsMenuItem) {
            return 'CMS_MENU_ITEM_NOT_FOUND';
        } else {
            $file = $this->request->files->get('file');

            if (in_array($file->getMimeType(), array('image/jpeg', 'image/jpg', 'image/png', 'image/gif'))) {
                $originalFileName = time().'_'.$file->getClientOriginalName();

                if (!file_exists($this->cmsMenuMediaUploadLocation['path'])) {
                    mkdir($this->cmsMenuMediaUploadLocation['path'], 0777, true);
                }

                $file->move($this->cmsMenuMediaUploadLocation['path'], $originalFileName);

                //$cmsMenuItem->setBackgroundImage($originalFileName);
                //$this->cmsMenuItemRepository->set($cmsMenuItem);

                return array('file' => $originalFileName);
            } else {
                return 'INVALID_FILE';
            }
        }
    }
    
    /**
     * @author Employee Id: 4464
     * Description : Save static page to database while creating menu
     *
     * @return object
     * */
    public function setCmsPageFromStaticPage()
    {
        $data = array();
        $data['country_id'] = $this->request->get("country_id", $this->countryId);
        $data['slug'] = $this->request->get("slug");
        $data['language_id'] = $this->request->get("language_id", $this->languageId);
        $data['label'] = $this->request->get("label", '');
        $menuId = $this->request->get("menu_id");
        $itemId = $this->request->get("item_id");
        $url = $this->request->get("url");
        
        $cmsPageMaster = $this->cmsPageManager->setCmsPageFromStaticPage($data);

        $cmsMenuItem = $this->cmsMenuItemRepository->findByMenuIdAndItemId($menuId, $itemId);

        $menuItemLanguage = $cmsMenuItem->getLanguageMapping();
        foreach ($menuItemLanguage as $key => $value) {
            $value->setUrl($url);
            $this->cmsMenuItemLanguageRepository->set($value);
        }
        
        $cmsMenuItem->setReferenceId($cmsPageMaster->getId());
        
        $this->cmsMenuItemRepository->set($cmsMenuItem);
    }

    public function create($slug, $menuItems, $instanceId)
    {
        $instanceMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->find($instanceId);

        $cmsMenuMaster = $this->cmsMenuMasterRepository->findBySlugWithInstanceId($slug, $instanceId);

        if (count($cmsMenuMaster) == 0) {
            foreach ($this->countries as $country) {
                $cmsMenuMaster = new CmsMenuMaster();
                $cmsMenuMaster->setName('subshop.theme_element.'.$slug);
                $cmsMenuMaster->setSlug($slug);
                $cmsMenuMaster->setStatus('1');
                $cmsMenuMaster->setCreatedUid($this->projectSetting['user_id']);
                $cmsMenuMaster->setUpdatedUid($this->projectSetting['user_id']);
                $cmsMenuMaster->setCreatedAt(new \DateTime());
                $cmsMenuMaster->setUpdatedAt(new \DateTime());
                $cmsMenuMaster->setCountryId($country['id']);
                $cmsMenuMaster->setInstanceId($instanceId);
                $cmsMenuMaster->setInstanceType($instanceMaster->getInstanceType());

                $cmsMenuMaster = $this->cmsMenuMasterRepository->set($cmsMenuMaster);

                if (count($menuItems) > 0) {
                    foreach ($menuItems as $item) {
                        $item['menuItemtype'] = 'custom';
                        $item['parentId'] = '0';
                        $item['referenceId'] = '0';

                        $this->addMenuItem($cmsMenuMaster, $item, $country['language']);
                    }
                }
            }
        }
    }

    public function addMenuItem($cmsMenuMaster, $item, $languages)
    {
        $cmsMenuItem = new CmsMenuItem();
        $cmsMenuItem->setMenuId($cmsMenuMaster);
        $cmsMenuItem->setParentId($item['parentId']);
        $cmsMenuItem->setSortOrder('0');
        $cmsMenuItem->setItemType($item['menuItemtype']);
        $cmsMenuItem->setReferenceId($item['referenceId']);
        $cmsMenuItem->setCreatedAt(new \DateTime());
        $cmsMenuItem->setCreatedUid($this->projectSetting['user_id']);
        $cmsMenuItem->setVisibility(1);
        $cmsMenuItem->setJsonString($this->createJsonString($item));

    	if(isset($item['css_classe'])){
        	$cmsMenuItem->setCssClasse($item['css_classe']);
        }

        if(isset($item['css_icon'])){
        	$cmsMenuItem->setCssIcon($item['css_icon']);
        }
        $cmsMenuItem = $this->cmsMenuItemRepository->set($cmsMenuItem);

        if (count($languages) > 0) {
            foreach ($languages as $key => $languageId) {
            	$title = $item['title'];
            	
            	if (isset($item['language'][$languageId]['title'])) {
            		$title = $item['language'][$languageId]['title'];
            	}

                $cmsMenuItemLanguage = new CmsMenuItemLanguage();
                $cmsMenuItemLanguage->setItemId($cmsMenuItem);
                $cmsMenuItemLanguage->setLanguageId($languageId);
                $cmsMenuItemLanguage->setItemLabel($title);
                $cmsMenuItemLanguage->setTitle($title);
                if(isset($item['options'])){   // for custom link using symfony2 generateurl. Include route name in 'path' and slugs in 'parameters'
                	$parameters = array();
                	if(isset($item['options']['parameters'])){
                		$parameters	= $item['options']['parameters'];
                	}

                	if (!isset($parameters['_locale'])) {
                		$parameters['_locale'] = $this->getLanguageCodeById($languageId).'_'.$this->getCountryCodeById($cmsMenuMaster->getCountryId());
                	}

                	$linkUrl = $this->routerManager->generate($item['options']['path'], $parameters);
                	$cmsMenuItemLanguage->setUrl($linkUrl);
                }else{
                	$cmsMenuItemLanguage->setUrl($item['link']);
                }
                

                $this->cmsMenuItemLanguageRepository->set($cmsMenuItemLanguage);
            }
        }

        if (isset($item['children']) && count($item['children']) > 0) {
            foreach ($item['children'] as $subItem) {
                $subItem['menuItemtype'] = 'custom';
                $subItem['parentId'] = $cmsMenuItem->getId();
                $subItem['referenceId'] = '0';

                $this->addMenuItem($cmsMenuMaster, $subItem, $languages);
            }
        }

        RedisCacheService::removeCacheByPrefix($this->statsh_cache_wrapper,$this->moduleCachePrefix);
    }
    
    /**
     * @author Employee Id: 4464
     * Description : Get search criteria array from search criteria id
     *
     * @return search criteria array
     * */
    public function getSearchCriteria()
    {
        $searchCriteria = $this->searchCriteriaManager->getSearchCriteriaById(); //Takes id from request object in extended class
        
        if (empty($searchCriteria)) {
            return 'SEARCH_CRITERIA_NOT_FOUND';
        }
        
        $searchQuery = $searchCriteria->getAttribute();
        
        unset($searchCriteria);
        
        return json_decode($searchQuery, true);
    }
    /**
     * @author Employee Id: 4488
     * Description : Get Tag List id
     *
     * @return search criteria array
     * */
    public function getTagListFromCmsMenu($id='')
    {
    	return $tagArray=$this->cmsMenuItemRepository->getTagListFromCmsMenu($id);
    	
    }
    
	public function setCmsMenuItemRights()
    {
    	$itemArray = $this->request->get('item_hidden');
    	$userType = array_keys($this->userType);
    	$menu = $this->getMenu();
    	
    	if (is_object($menu)) {
	    	foreach($userType  as $type) {
	    		$item = $this->request->get('item_'.$type);
	    		$cmsMenuRights = $this->cmsMenuRightsRepository->findByType($menu->getSlug(), $this->countryId, $type);
	    		if (count($cmsMenuRights) > 0) {
	    			$cmsMenuRights->setMenuItems(count($item) ? json_encode($item) : '');
	    			$this->cmsMenuRightsRepository->set($cmsMenuRights);
	    			
	    			RedisCacheService::removeCacheByPrefix($this->statsh_cache_wrapper,$this->moduleCachePrefix);
	    		}
	    	}
    	}
    	return true;
    }

    public function getCmsMenuItemRights($slug = '')
    {
    	$return = array();

    	if ($slug == '') {
    		$slug = $this->request->get('slug');
    	} 

    	$cmsMenuRights = $this->cmsMenuRightsRepository->findBySlug($slug, $this->countryId);
		
		foreach ($cmsMenuRights as $item) {
			$return[$item->getUserType()] = json_decode($item->getMenuItems(), 'Array');
    		
    	}

    	ksort($return);

    	return $return;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to set category tree view
     * 
     * @param 1: $categories
     * 
     * @return: Multilevel tree structure of categories
     *
     * @throws Exception: Null
     */
    public function buildCategoryTree($categories, $languageProductCategories, $locate){
        $branch = array();

        $locateExplode = explode('_', $locate);

        foreach ($categories as $index => $category) {
        	$languageProductCategory = array();
        	$branch[$index]['cat_master_id'] = $category['cat_master_id'];

        	if (isset($this->languages[$locateExplode[0]]['id']) && $this->languageId == $this->languages[$locateExplode[0]]['id']) {
        		$displayCategoryName = $category['cat_name'];
        	}

        	if (count($languageProductCategories) > 0) {
        		foreach($languageProductCategories as $locateKey => $productCategories) {
        			$languageProductCategory[$locateKey] = $this->findLanguageProductCategory($productCategories, $category['cat_master_id']);
        		}
        	}

        	$categoryName = array($category['cat_name']);
        	$categorySlug = array($category['slug']);

        	foreach ($languageProductCategory as $locateKey => $categoryDetail) {
        		
        		if (isset($categoryDetail['cat_name'])) {
        			$categoryName[] = $categoryDetail['cat_name'];
        			
        			$locateKeyExplode = explode('_', $locateKey);
        			
        			if (isset($this->languages[$locateKeyExplode[0]]['id']) && $this->languageId == $this->languages[$locateKeyExplode[0]]['id']) {
        				$displayCategoryName = $categoryDetail['cat_name'];
        			}
        		}

        		if (isset($categoryDetail['slug'])) {
        			$categorySlug[] = $categoryDetail['slug'];
        		}
        	}

            $branch[$index]['cat_name'] = $categoryName;
            $branch[$index]['slug'] = $categorySlug;

            $branch[$index]['display_cat_name'] = $displayCategoryName;
            
            if(!empty($category['child'])){
                $children = $this->buildCategoryTree($category['child'], $languageProductCategories, $locate);
                if ($children) {
                    $branch[$index]['child'] = $children;
                }
            }
        }
        return $branch;
    }

    public function findLanguageProductCategory($productCategories, $catMasterId) {
    	$categoryDetail = array();

    	foreach ($productCategories as $index => $category) {
    		if ($catMasterId == $category['cat_master_id']) {
    			$categoryDetail['cat_name'] = $category['cat_name'];
    			$categoryDetail['slug'] = $category['slug'];
    			break;
    		}

    		if(!empty($category['child']) && count($categoryDetail) == 0){
    			$categoryDetail = $this->findLanguageProductCategory($category['child'], $catMasterId);
    		}
    	}

    	return $categoryDetail;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to create json string from menu item data
     * 
     * @param 1: $menuItem
     * 
     * @return: Multilevel tree structure of categories
     *
     * @throws Exception: Null
     */
    public function createJsonString($menuItem){
        $convertToJson['menu_item_type'] = $menuItem['menuItemtype'];
        $convertToJson['reference_id'] = $menuItem['referenceId'];
        $convertToJson['title'] = $menuItem['title'];

        if (isset($menuItem['slug'])) {
        	$convertToJson['slug'] = $menuItem['slug'];
        }

        return json_encode($convertToJson);
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to format menu items type and url before saving
     * 
     * @param 1: $menu
     * 
     * @return: Multilevel tree structure of categories
     *
     * @throws Exception: Null
     */
    public function formatMenu($menu){
        $menuItems = $menu->getMenuItemMapping();
        foreach ($menuItems as $menuItem){
            $itemType = $menuItem->getItemType();
            $parentId = $menuItem->getParentId();
            $parentMenuItem = $this->cmsMenuItemRepository->findByParentId($parentId);
            if($parentId != 0 && !empty($parentMenuItem)){
                $parentItemType = $parentMenuItem->getItemType();
                if(($itemType == 'product-category' || $itemType == 'category-product-list') && ($parentItemType == 'product-tag')){
                    $menuItem->setItemType('product-tag-category');
                    $menuItemJsonString = $menuItem->getJsonString();
                    $menuItemConvertToJson = json_decode($menuItemJsonString,true);
                    $menuItemConvertToJson['menu_item_type'] = 'product-tag-category';
                    $menuItemConvertToJson['params']['category_filter[]'] = $menuItem->getReferenceId();
                    $menuItemConvertToJson['params']['tag_filter[]'] = $parentMenuItem->getReferenceId();
                    $menuItem->setJsonString(json_encode($menuItemConvertToJson));
                    //EMP4464: Need to set below route
                    //$url = $this->routerManager->generate('office_brain_search_bundle_search', array('_locale' => $this->getLocateByLanguageId($itemLanguage),'category_filter[]'=>$item['referenceId'],'tag_filter[]'=>'{tag_id}'));
                }
            }
        }
    }
    
    /**
     * @author Employee Id: 4494
     *
     * Description : This function is used to copy menu items by country id
     *
     * @param 1: no param
     *
     * @return: menu id and menu item count
     *
     * @throws Exception: Null
     */
    public function copyMenuItemByCountryId()
    {
    	$return = array();
    	$cmsMenu = $this->getMenuBySlug();
    
    	if (!$cmsMenu) {
    		return 'CMS_MENU_NOT_FOUND';
    	} else {
    		$copyCmsMenuMaster = $this->cmsMenuMasterRepository->findBySlug($this->request->get('slug'), $this->request->get('country_id'), false);
    		$menuItem = $cmsMenu->getMenuItemMapping();
    		if (count($copyCmsMenuMaster) > 0 && count($menuItem) > 0 && count($copyCmsMenuMaster->getMenuItemMapping()) != count($menuItem)) {
    			$parentMapping = array();
    			foreach ($menuItem as $item) {
    				$cmsMenuItem = new CmsMenuItem();
    				$cmsMenuItem->setMenuId($copyCmsMenuMaster);
    				$cmsMenuItem->setParentId($item->getParentId());
    				$cmsMenuItem->setItemType($item->getItemType());
    				$cmsMenuItem->setReferenceId($item->getReferenceId());
    				$cmsMenuItem->setCssClasse($item->getCssClasse());
    				$cmsMenuItem->setCssIcon($item->getCssIcon());
    				$cmsMenuItem->setBackgroundImage($item->getBackgroundImage());
    				$cmsMenuItem->setSortOrder($item->getSortOrder());
    				$cmsMenuItem->setCreatedUid($item->getCreatedUid());
    				$cmsMenuItem->setUpdatedUid($item->getUpdatedUid());
    				$cmsMenuItem->setDeletedUid($item->getDeletedUid());
    				$cmsMenuItem->setCreatedAt(new \DateTime());
    				$cmsMenuItem->setVisibility($item->getVisibility());
    
    				$cmsMenuItem = $this->cmsMenuItemRepository->set($cmsMenuItem);
    				$copyCmsMenuMaster->addMenuItemMapping($cmsMenuItem);
    
    				$parentMapping[$item->getId()] = $cmsMenuItem->getId();
    
    				foreach($item->getLanguageMapping() as $itemLanguage) {
    					$cmsMenuItemLanguage = new CmsMenuItemLanguage();
    					$cmsMenuItemLanguage->setItemId($cmsMenuItem);
    					$cmsMenuItemLanguage->setLanguageId($itemLanguage->getLanguageId());
    					$cmsMenuItemLanguage->setItemLabel($itemLanguage->getItemLabel());
    					$cmsMenuItemLanguage->setTitle($itemLanguage->getTitle());
    					$cmsMenuItemLanguage->setUrl($itemLanguage->getUrl());
    					$cmsMenuItemLanguage->setUrlTarget($itemLanguage->getUrlTarget());
    					$cmsMenuItemLanguage->setDescription($itemLanguage->getDescription());
    
    					$this->cmsMenuItemLanguageRepository->set($cmsMenuItemLanguage);
    					$cmsMenuItem->addLanguageMapping($cmsMenuItemLanguage);
    				}
    			}
    
    			if (count($parentMapping) > 0) {
    				foreach ($copyCmsMenuMaster->getMenuItemMapping() as $cmsMenuItem) {
    					if ($cmsMenuItem->getParentId() > 0 && isset($parentMapping[$cmsMenuItem->getParentId()])) {
    						$cmsMenuItem->setParentId($parentMapping[$cmsMenuItem->getParentId()]);
    					} else {
    						$cmsMenuItem->setParentId('0');
    					}
    
    					$this->cmsMenuItemRepository->set($cmsMenuItem);
    				}
    			}
    		}
    
    		$return['menu_id'] = $copyCmsMenuMaster->getId();
    		$return['menu_item'] = count($copyCmsMenuMaster->getMenuItemMapping());
    	}
    
    	return $return;
    }

    public function cloneMenuItems($cmsMenuMaster, $cmsMenuItems) {
    	$return = array("menu_items" => 0, "menu_id" => 0);

    	if (count($cmsMenuMaster) > 0 && count($cmsMenuItems) > 0 && count($cmsMenuMaster->getMenuItemMapping()) != count($cmsMenuItems)) {
    		$parentMapping = array();
    		foreach ($cmsMenuItems as $item) {
    			$cmsMenuItem = new CmsMenuItem();
    			$cmsMenuItem->setMenuId($cmsMenuMaster);
    			$cmsMenuItem->setParentId($item->getParentId());
    			$cmsMenuItem->setItemType($item->getItemType());
    			$cmsMenuItem->setReferenceId($item->getReferenceId());
    			$cmsMenuItem->setCssClasse($item->getCssClasse());
    			$cmsMenuItem->setCssIcon($item->getCssIcon());
    			$cmsMenuItem->setBackgroundImage($item->getBackgroundImage());
    			$cmsMenuItem->setSortOrder($item->getSortOrder());
    			$cmsMenuItem->setCreatedUid($item->getCreatedUid());
    			$cmsMenuItem->setUpdatedUid($item->getUpdatedUid());
    			$cmsMenuItem->setDeletedUid($item->getDeletedUid());
    			$cmsMenuItem->setCreatedAt(new \DateTime());
    			$cmsMenuItem->setVisibility($item->getVisibility());

    			$cmsMenuItem = $this->cmsMenuItemRepository->set($cmsMenuItem);
    			$cmsMenuMaster->addMenuItemMapping($cmsMenuItem);

    			$parentMapping[$item->getId()] = $cmsMenuItem->getId();

    			foreach($item->getLanguageMapping() as $itemLanguage) {
    				$cmsMenuItemLanguage = new CmsMenuItemLanguage();
    				$cmsMenuItemLanguage->setItemId($cmsMenuItem);
    				$cmsMenuItemLanguage->setLanguageId($itemLanguage->getLanguageId());
    				$cmsMenuItemLanguage->setItemLabel($itemLanguage->getItemLabel());
    				$cmsMenuItemLanguage->setTitle($itemLanguage->getTitle());
    				$cmsMenuItemLanguage->setUrl($itemLanguage->getUrl());
    				$cmsMenuItemLanguage->setUrlTarget($itemLanguage->getUrlTarget());
    				$cmsMenuItemLanguage->setDescription($itemLanguage->getDescription());
    	
    				$this->cmsMenuItemLanguageRepository->set($cmsMenuItemLanguage);
    				$cmsMenuItem->addLanguageMapping($cmsMenuItemLanguage);
    			}
    		}

    		if (count($parentMapping) > 0) {
    			foreach ($cmsMenuMaster->getMenuItemMapping() as $cmsMenuItem) {
    				if ($cmsMenuItem->getParentId() > 0 && isset($parentMapping[$cmsMenuItem->getParentId()])) {
    					$cmsMenuItem->setParentId($parentMapping[$cmsMenuItem->getParentId()]);
    				} else {
    					$cmsMenuItem->setParentId('0');
    				}

    				$this->cmsMenuItemRepository->set($cmsMenuItem);
    			}
    		}

    		$return['menu_id'] = $cmsMenuMaster->getId();
    		$return['menu_items'] = count($cmsMenuMaster->getMenuItemMapping());
    	}

    	return $return;
    }
}
