<?php

namespace OfficeBrain\Bundle\SubShopBundle\Manager\Extended;

use OfficeBrain\Bundle\SubShopBundle\Manager\AbstractManager\SubShopAbstract as SubShopAbstract;
use OfficeBrain\Bundle\SearchBundle\Form\Data\ProductSearchData;
use OfficeBrain\Bundle\SearchBundle\Form\Type\ProductSearchType;
use OfficeBrain\Bundle\AccessManagementBundle\Entity\InstanceConfiguration;
use OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceGroup;
use OfficeBrain\Bundle\ServiceGroupBundle\Entity\ServiceGroupLanguage;

/**
 * @author OfficeBrain 4494 <info@officebrain.com>
 *
 * Description : Sub shop extended class.
 **/
class SubShopExtended extends SubShopAbstract
{
    public function __construct($entityManager, $request, $subShopThemeManager, $subShopInquiryManager, $userManager, $emailManager, $searchManager, $formManager, $countries, $languages, $paginatorManager)
    {
        parent::__construct($entityManager, $request, $subShopThemeManager, $subShopInquiryManager, $userManager, $emailManager, $searchManager, $formManager, $countries, $languages, $paginatorManager);
    }

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

    /**
     * @author Employee Id: 4494
     * Description : Set the subshop.
     *
     * @param 1 : SubShop object.
     *
     * @return type : Subshop id.
     *
     * @throws Exception: Null
     */
    public function checkDuplicateShopDomain($subShop, $setSubShopThemeDesign = false, $inquiryId = 0)
    {
        $domain = preg_replace('#^https?://#', '', strtolower($subShop->getShopDomain())).'.'.($this->getPostFixDomain());

        $data = $this->repository->createQueryBuilder('u')
            ->where('u.shopDomain = :shopDomain','u.id != :id')
            ->setParameter('shopDomain', $domain)
            ->setParameter('id', $subShop->getId())
            ->getQuery()
            ->getResult();
        if(count($data)==0){
            return true;
        }else{
            return false;
        }
    }
    /**
     * @author Employee Id: 4494
     * Description : Set the subshop.
     *
     * @param 1 : SubShop object.
     *
     * @return type : Subshop id.
     *
     * @throws Exception: Null
     */
    public function setSubShop($subShop, $setSubShopThemeDesign = false, $inquiryId = 0)
    {
        if (is_object($subShop->getSiteOwner()) > 0) {
            $subShop->setSiteOwner($subShop->getSiteOwner()->getId());
        }

        if ($subShop->getId() <= 0) {
            $subShop->setCreatedUid($this->projectSetting['user_id']);
            $subShop->setInstanceId($this->projectSetting['instance_id']);
            $subShop->setInstanceType($this->projectSetting['instance_type']);
            $subShop->setUpdatedAt(new \DateTime());
            $subShop->setUpdatedUid($this->projectSetting['user_id']);
        }

        $subDomain = explode('.', $subShop->getShopDomain());

        if (isset($subDomain[0])) {
            $subShop->setShopDomain($subDomain[0]);
        }
        $domain = preg_replace('#^https?://#', '', strtolower($subShop->getShopDomain())).'.'.($this->getPostFixDomain());
        $subShop->setShopDomain($domain);

        $extrnalUrl = $subShop->getExternalShopDomain();
        if ($extrnalUrl != '') {
        	$extrnalUrl = str_ireplace('www.', '', strtolower(preg_replace('#^https?://#', '', strtolower($extrnalUrl))));
        	$exportExtrnalUrl = explode('.', $extrnalUrl);
        	
        	if (count($exportExtrnalUrl) <= 2) {
        		$extrnalUrl = 'www.'.$extrnalUrl;
        	}
        	 
        	$subShop->setExternalShopDomain($extrnalUrl);
        }

        if ($subShop->getToken() == '') {
            $subShop->setToken($this->getSecurityToken());
        }

        $subShop = $this->repository->set($subShop);

        if ($subShop->getParentId() > 0) {
            $instanceMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->find($subShop->getParentId());
            $instanceMaster->setDomain($domain);
            $instanceMaster->setStatus($subShop->getStatus());
            $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->set($instanceMaster);

            unset($domain);
            unset($instanceMaster);
        }

        if ($setSubShopThemeDesign) {
            //$this->subShopThemeManager->initSubShopThemeDesign($subShop->getId());
        }

        if ($inquiryId > 0) {
            $this->subShopInquiryManager->approveSubShopInquiry($inquiryId);
        }

        return $subShop;
    }

    /**
     * @author Employee Id: 4494
     * Description : Get the subshop.
     *
     * @param 1 : SubShop id
     *
     * @return type : SubShop object.
     *
     * @throws Exception: Null
     */
    public function getSubShop()
    {
        $id = $this->request->get('id');
        $token = $this->request->get('token');

        if ($id <= 0) {
            $id = $this->request->get('subshop_id');
        }

        if ($id > 0) {
            $subShop = $this->repository->find($id);
        } elseif ($token != '') {
            $subShop = $this->getSubShopByToken();
        }

        if (!$subShop) {
            return 'SUBSHOP_NOT_FOUND';
        }

        unset($id);
        unset($token);

        return $subShop;
    }

    public function getSubShopByToken()
    {
        $subShop = $this->repository->findByToken($this->request->get('token'));

        if (!$subShop) {
            return 'SUBSHOP_NOT_FOUND';
        }

        return $subShop;
    }
    /**
     * @author Employee Id: 4494
     * Description : Gets the subshop list.
     *
     * @return type : SubShop list.
     *
     * @throws Exception: Null
     */
    public function getSubShopList()
    {
        return $this->repository->findAll();
    }

    /**
     * @author Employee Id: 5058
     * Description : Gets the subshop list by Instance Id.
     *
     * @return type : SubShop list.
     *
     * @throws Exception: Null
     */
    public function getSubShopListByInstance()
    {
        return $this->repository->findByInstanceWithImage();
    }

    /**
     * @author Employee Id: 4494
     * Description : Delete subshop.
     *
     * @param 1 : SubShop Id
     *
     * @return type : Subshop id.
     *
     * @throws Exception: Null
     */
    public function deleteSubShop()
    {
        $currentDateTime = new \DateTime();
        $subShop = $this->getSubShop();
        $subShop->setDeletedAt($currentDateTime);
        $subShop->setDeletedUid($this->projectSetting['user_id']);

        $subShop->setShopDomain($subShop->getShopDomain().'_'.$currentDateTime->format('Y-m-d H:i:s'));

        $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->delete($subShop->getParentId());

        unset($id);
        unset($currentDateTime);

        return $this->setSubShop($subShop);
    }

    /**
     * @author Employee Id: 4494
     * Description : Revert back the subshop to active list status.
     *
     * @param 1 : SubShop Id.
     *
     * @return type : Subshop Id.
     *
     * @throws Exception: Null
     */
    public function revertSubShop()
    {
        $subShop = $this->getSubShop();
        $subShop->setDeletedAt(null);
        $subShop->setStatus('1');

        unset($id);

        return $this->setSubShop($subShop);
    }

    /**
     * @author Employee Id: 4494
     * Description : Approve the subshop.
     *
     * @param 1 : SubShop Id.
     *
     * @return type : Subshop Id returned from setSubShop function.
     *
     * @throws Exception: Null.
     */
    public function approveSubShop()
    {
        $subShop = $this->getSubShop();
        $subShop->setStatus('1');

        unset($id);

        return $this->setSubShop($subShop);
    }

    /**
     * @author Employee Id: 4494
     * Description : Reject the subshop.
     *
     * @param 1 : SubShop Id.
     *
     * @return type : Subshop Id.
     *
     * @throws Exception: Null
     */
    public function rejectSubShop()
    {
        $subShop = $this->getSubShop();
        $subShop->setStatus('2');

        unset($id);

        return $this->setSubShop($subShop);
    }

    /**
     * @author Employee Id: 4494
     * Description : Put subshop onhold.
     *
     * @param 1 : SubShop Id
     *
     * @return type : Subshop Id returned from setSubShop function.
     *
     * @throws Exception: Null
     */
    public function onHoldSubShop()
    {
        $subShop = $this->getSubShop();
        $subShop->setStatus('0');

        unset($id);

        return $this->setSubShop($subShop);
    }

    /**
     * @author Employee Id: 4494
     * Description : Search subshop by status.
     *
     * @param 1 : SubShop status id.
     *
     * @return type : Subshop list.
     *
     * @throws Exception: Null
     */
    public function searchByStatusSubShop()
    {
        $statusId = $this->request->get('status_id');
        switch ($this->request->get('tab')) {
            case 'subshop_inactive_list' :
                $statusId = '0';
                break;

            case 'subshop_list' :
                $statusId = '1';
                break;

            case 'subshop_draft_list' :
                $statusId = '2';
                break;
        }

        $subShopList = $this->repository->findByStatus($statusId);

        unset($statusId);

        return $this->paginatorManager->paginate($subShopList, $this->request->get('page'), $this->recordsPerPage, array(), count($subShopList));
    }

    /**
     * @author Employee Id: 4494
     * Description : search deleted subshop
     *
     * @param 1: No paramater
     *
     * @return type : subshop list.
     *
     * @throws Exception: Null
     */
    public function searchByDeleteSubShop()
    {
        $subShopList = $this->repository->findByDelete();

        return $this->paginatorManager->paginate($subShopList, $this->request->get('page'), $this->recordsPerPage, array(), count($subShopList));
    }

    /**
     * @author Employee Id: 4494.
     * Description : Search subshop with parent from database using Repository
     *
     * @param 1 : Instatnce id from Proejct Setting.
     *
     * @return type : subshop list by parentId returned from repository.
     *
     * @throws Exception: Null.
     */
    public function searchByParentIdSubShop($id = 0)
    {
        return $this->repository->findByParentId($id);
    }

    /**
     * @author Employee Id: 4494.
     * Description : Search Subshop .
     *
     * @param 1 : No paramater
     *
     * @return type :Subshop  List.
     *
     * @throws Exception: Null.
     **/
    public function searchSubShop()
    {
        $statusId = null;
        $tabStatus = array('subshop_inactive_list' => 0, 'subshop_list' => 1, 'subshop_draft_list' => 2);

        if (isset($tabStatus[$this->request->get('tab')])) {
            $statusId = $tabStatus[$this->request->get('tab')];
        }

        $subShopList = $this->repository->findByOption($this->request->get('option'), $this->request->get('keyword'), $statusId);

        unset($statusId);

        return $this->paginatorManager->paginate($subShopList, $this->request->get('page'), $this->recordsPerPage, array(), count($subShopList));
    }

    /**
     * @author Employee Id: 4494.
     * Description : Send subshop approve acknowledgement mail..
     *
     * @param 1 : Subshop
     *
     * @return type :Subshop id.
     *
     * @throws Exception: Null.
     **/
    public function sendApprovedAcknowledgement($subShop)
    {

    	$storeLink = $subShop->getShopDomain();
    	$storeLinkString = '<a style="text-decoration: none; font-style: italic; color: #cc2929;" href="'.$storeLink.'" target="_blank">'.$storeLink.'</a>';
        $this->emailManager->sendMail('subshop_inquiry_approved_acknowledgement', $subShop->getAdminEmail(), array('id'=>$subShop->getId(),'storelink' => $storeLinkString), 1);

        $subShop->setIsMailSent(1);

        return $this->setSubShop($subShop);
    }

    public function setSubShopDesignTheme($instanceType = 'sub_shop')
    {
        $themeId = $this->request->get('theme-id');

        $subShop = $this->getSubShop();

        if($instanceType == 'sub_shop')
        {
            $instanceType = $subShop->getSubShopInstanceType();
        }

        if ($themeId != $subShop->getShopThemeId()) {
            $subShop->setShopThemeId($themeId);

            $subShopTheme = $this->subShopThemeManager->getSubShopTheme($themeId);

            if ($subShop->getParentId() <= 0) {
                $instance = array(
                        'theme' => $this->entityManager->getRepository('OfficeBrainThemeBundle:ThemeMaster')->find($subShopTheme->getParentId()),
                        'instanceType' => $instanceType,
                        'domain' => $subShop->getShopDomain(),
                        'ownerId' => $subShop->getSiteOwner() > 0 ? $subShop->getSiteOwner() : $subShop->getCreatedUid(),
                        'status' => $subShop->getStatus(),
                		'cultureId' => $this->projectSetting['culture_id'],
                		'cultureCode' => $this->projectSetting['culture_code'],
                		'currencyCode' => $this->projectSetting['currency_code'],
                		'currencyName' => $this->projectSetting['currency_name'],
                		'priceInDecimal' => $this->projectSetting['price_in_decimal'],
                );

                $subShop->setParentId($this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->add($instance));

                $this->prepareInstance($subShop->getParentId());
            } else {
                $instanceMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->find($subShop->getParentId());
                $instanceMaster->setTheme($this->entityManager->getRepository('OfficeBrainThemeBundle:ThemeMaster')->find($subShopTheme->getParentId()));
                $instanceMaster->setDomain($subShop->getShopDomain());
                $instanceMaster->setStatus($subShop->getStatus());
                $instanceMaster->setInstanceType($instanceType);
                $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->set($instanceMaster);
            }

            $this->subShopThemeManager->changeSubShopTheme($subShop->getId());

            $this->subShopThemeManager->prepareSubShopThemeData(0, $subShop->getParentId(), $subShopTheme);

            return $this->setSubShop($subShop);
        }

        return $subShop;
    }

    public function prepareInstance($instanceId = 0)
    {
        $this->subShopThemeManager->addSubShopInstanceKey('theme_area', null, $instanceId);
        $this->subShopThemeManager->addSubShopInstanceKey('theme_data', null, $instanceId);
        $this->subShopThemeManager->addSubShopInstanceKey('product_criteria', null, $instanceId);
        $this->subShopThemeManager->addSubShopInstanceKey('product_solr_status', null, $instanceId);

        $stepStatus = array(
                        'site_configuration' => 0,
                        'product_configuration' => 0,
                        'theme_configuration' => 0,
                        'cms' => 0,
        );

        $this->subShopThemeManager->addSubShopInstanceKey('step_status', json_encode($stepStatus), $instanceId);
        $this->setSubShopInstanceConfiguration($instanceId);
        $this->setDefaultServiceGroup($instanceId);
        unset($stepStatus);
    }

    public function updateSubShopStep($step, $value, $instanceId = 0)
    {
        if ($instanceId == 0) {
            $subShop = $this->getSubShop();
            $instanceId = $subShop->getParentId();
        }

        $subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('step_status', $instanceId);

        $stepStatus = json_decode($subShopInstanceMeta->getMetaValue(), 'Array');

        if (isset($stepStatus[$step])) {
            $stepStatus[$step] = $value;
        }

        $stepStatus = json_encode($stepStatus);

        $subShopInstanceMeta->setMetaValue($stepStatus);

        return $this->subShopThemeManager->updateSubShopInstanceKey($subShopInstanceMeta);
    }

    public function getSubShopStep($instanceId = 0)
    {
        if ($instanceId == 0) {
            $subShop = $this->getSubShop();
            $instanceId = $subShop->getParentId();
        }

        $subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('step_status', $instanceId);

        if ($subShopInstanceMeta) {
            return json_decode($subShopInstanceMeta->getMetaValue(), 'Array');
        }
    }

    public function updateSubShopDesign()
    {
        $subShop = $this->getSubShopByToken();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            return $this->subShopThemeManager->updateSubShopThemeMeta($subShop->getParentId());
        }
    }

    public function publishSubShopDesign()
    {
        $subShop = $this->getSubShopByToken();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            $this->subShopThemeManager->updateSubShopThemeMeta($subShop->getParentId());
            $this->updateSubShopStep('theme_configuration', '1');
            $subShop->setStatus('1');

            return $this->setSubShop($subShop);
        }
    }

    public function publishMasterSiteDesign()
    {
    	if ($this->projectSetting['is_main_instance'] == '1') {
    		return $this->subShopThemeManager->updateSubShopThemeMeta($this->projectSetting['instance_id']);
    	}
    }

    public function getSubShopCms()
    {
        $data = array();
        $subShop = $this->getSubShop();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            $subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $subShop->getParentId());

            $subShopInstanceMeta = json_decode($subShopInstanceMeta->getMetaValue(), 'Array');

            if (isset($subShopInstanceMeta['cms'])) {
                $data['subshop'] = $subShopInstanceMeta['cms'];
                $data['subshop_cms'] = $subShopInstanceMeta['cms'];
            }
        }

        return $data;
    }

    public function updateSubShopCriteria($environment)
    {
        $subShop = $this->getSubShop();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            $data = $this->request->request->all();
            $country = $data['country'];
            $params = array();
            foreach ($country as $key => $val) {
                $attribute = '';
                parse_str($data['data'][$key], $attribute);
                $params[$val] = $attribute;
            }

            $this->subShopThemeManager->setSubShopInstanceKey('product_criteria', json_encode($params), $subShop->getParentId());
            $this->subShopThemeManager->setSubShopInstanceKey('product_solr_status', false, $subShop->getParentId());

            $kernelRootDir = 'php '.$this->subShopThemeManager->subShopMediaUploadLocation['kernel_root_dir'];
            $cmd = $kernelRootDir.DIRECTORY_SEPARATOR.'console office_brain:solr:sync:subshop-product --projectId='.$this->projectSetting['project_id'].' --culture='.$this->projectSetting['culture_code'].' --instanceId='.$this->projectSetting['instance_id'].' --subShopInstanceId='.$subShop->getParentId().' --languageId='.$this->languageId.' --env="'.$environment.'" > /dev/null 2>/dev/null &';
            exec($cmd);

            unset($data);
            unset($country);
            unset($params);
        }

        return $subShop;
    }

    public function getSubShopCriteria()
    {
        $subShop = $this->getSubShop();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            $subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('product_criteria', $subShop->getParentId());

            return json_decode($subShopInstanceMeta->getMetaValue(), 'Array');
        }
    }

    public function getSubShopProductSolrStatus()
    {
    	$subShop = $this->getSubShop();

    	if ($subShop != 'SUBSHOP_NOT_FOUND') {
    		$subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('product_solr_status', $subShop->getParentId());

    		return json_decode($subShopInstanceMeta->getMetaValue(), 'Array');
    	}
    }

    public function updateSubShopSolrProducts()
    {
    	$productIds = array();
        $subShop = $this->getSubShop();

        if ($subShop != 'SUBSHOP_NOT_FOUND') {
            $subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('product_criteria', $subShop->getParentId());
            $subShopInstanceMeta = json_decode($subShopInstanceMeta->getMetaValue(), 'Array');

            if (count($subShopInstanceMeta) > 0) {
            	$productSearchData = new ProductSearchData($this->entityManager, $this->languageId);

                foreach ($subShopInstanceMeta as $country => $searchCriteria) {
                    $searchQuery = $this->getSearchQuery($searchCriteria);
 					$searchQuery['product_search']['instanceId'] = $this->projectSetting['instance_id'];

                    $form = $this->formManager->create(new ProductSearchType(), $productSearchData, array('csrf_protection' => false));
                    //continue;
                    $form->bind($searchQuery['product_search']);

                    if ($form->isValid()) {
                        $searchProducts = $this->searchManager->searchResult($form->getData(), true);

                        foreach ($searchProducts['search_result_array']['data'] as $val) {
                        	if (!in_array($val['product_id'], $productIds))
                        	{
                        		$productIds[] = $val['product_id'];
                        		$kernelRootDir = 'php '.$this->subShopThemeManager->subShopMediaUploadLocation['kernel_root_dir'];
                        		$cmd = $kernelRootDir.DIRECTORY_SEPARATOR.'console office_brain:solr:sync:product --productId='.$val['product_id'].' --instanceId='.$subShop->getParentId().' --projectId='.$this->projectSetting['project_id'] .' --culture='.$this->projectSetting['culture_code'];
                        		shell_exec($cmd);
                        	}
                        }
                        $this->subShopThemeManager->setSubShopInstanceKey('product_solr_status', true, $subShop->getParentId());

                        return $productIds;
                    }
                }
            }
        }
    }

    public function getSearchQuery($params)
    {
        $this->searchRequestArray = array();
        $this->mainFilter = $this->request->query->get('main_filter', 'keyword');
        $this->searchQuery = '';

        if (isset($params['search_query'])) {
            $this->searchQuery = trim($this->request->query->get('search_query', $params['search_query']));
        }

        $this->searchRequestArray['product_search'][$this->mainFilter] = $this->searchQuery;
        // Added for sort functionality
        $sortingValArray = explode('::', trim($this->request->query->get('sort_by', 'title::asc')));
        $sortValArray = array();

        if (isset($sortingValArray)) {
            if (isset($sortingValArray[0]) && isset($sortingValArray[1])) {
                $sortValArray['field'] = $sortingValArray[0];
                $sortValArray['order'] = $sortingValArray[1];
            }
        }
        // End add for sort functionality
        if (isset($params['min_price'])) {
            $this->searchRequestArray['product_search']['min_price'] = trim($this->request->query->get('min_price', $params['min_price']));
        }

        if (isset($params['max_price'])) {
            $this->searchRequestArray['product_search']['max_price'] = trim($this->request->query->get('max_price', $params['max_price']));
        }

        if (isset($params['category_filter'])) {
            $this->searchRequestArray['product_search']['categoryId'] = $this->request->query->get('category_filter', $params['category_filter']);
        }

        if (isset($params['brand_filter'])) {
            $this->searchRequestArray['product_search']['brandId'] = $this->request->query->get('brand_filter', $params['brand_filter']);
        }

        if (isset($params['supplier_filter'])) {
            $this->searchRequestArray['product_search']['supplierId'] = $this->request->query->get('supplier_filter', $params['supplier_filter']);
        }

        if (isset($params['currency_filter'])) {
            $this->searchRequestArray['product_search']['priceCurrency'] = $this->request->query->get('currency_filter', $params['currency_filter']);
        }

        if (isset($params['rating_filter'])) {
            $this->searchRequestArray['product_search']['rating'] = $this->request->query->get('rating_filter', $params['rating_filter']);
        }

        if (isset($params['price_valid_until'])) {
            $this->searchRequestArray['product_search']['priceValidUntil'] = $this->request->query->get('price_valid_until', $params['price_valid_until']);
        }

        if (isset($params['line_name_id'])) {
            $this->searchRequestArray['product_search']['lineNameId'] = $this->request->query->get('line_name_id', $params['line_name_id']);
        }

        if (isset($params['catalogyear_filter'])) {
            $this->searchRequestArray['product_search']['catalogYear'] = $this->request->query->get('catalogyear_filter', $params['catalogyear_filter']);
        }

        if (isset($params['tag_filter'])) {
            $this->searchRequestArray['product_search']['tag'] = trim($this->request->query->get('tag_filter', $params['tag_filter']));
        }

        if (isset($params['attribute_filter'])) {
            $this->searchRequestArray['product_search']['attribute'] = trim($this->request->query->get('attribute_filter', $params['attribute_filter']));
        }

        if (isset($params['colormapping_filter'])) {
            $this->searchRequestArray['product_search']['colorMapping'] = trim($this->request->query->get('colormapping_filter', $params['colormapping_filter']));
        }

        if (isset($params['save_search_name'])) {
            $this->searchRequestArray['search']['save_search_name'] = trim($this->request->query->get('save_search_name', $params['save_search_name']));
        }

        if (isset($params['sku'])) {
            $this->searchRequestArray['product_search']['sku'] = trim($this->request->query->get('sku', $params['sku']));
        }

        if (isset($params['supplier_name'])) {
            $this->searchRequestArray['product_search']['supplierName'] = $this->request->query->get('supplier_name', $params['supplier_name']);
        }

        if (isset($params['search_query'])) {
            $this->request->query->set($this->request->query->get('main_filter', 'keyword'), $this->request->query->get('search_query', $params['search_query']));
        }

        $this->searchRequestArray['product_search']['sort'] = $sortValArray;
        $this->searchRequestArray['search']['query'] = $this->searchQuery;
        $this->searchRequestArray['search']['main_filter'] = $this->mainFilter;
        $this->searchRequestArray['search']['culture'] = $this->projectSetting['locale_language'];

        return $this->searchRequestArray;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - getSubShopPromotionalProductsList
     * Function created to set parameters while calling subshop promotional products ajax
     */
    public function getSubShopPromotionalProductsList()
    {
    	$data = array();
    	$subShop = $this->getSubShop();

    	if ($subShop != 'SUBSHOP_NOT_FOUND') {
    		$subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('product_criteria', $subShop->getParentId());
    		$subShopInstanceMeta = json_decode($subShopInstanceMeta->getMetaValue(), 'Array');

    		if (is_array($subShopInstanceMeta) || $this->request->query->get('countryId') > 0) {
    			$data['countryId'] = $this->request->query->get('countryId') ? $this->request->query->get('countryId') : current(array_keys($subShopInstanceMeta));

    			if (count($subShopInstanceMeta) > 0) {
    				$data['countrys'] = array_keys($subShopInstanceMeta);
    			} else {
    				$data['countrys'] = array($this->countryId);
    			}
    		} else {
    			$data['countryId'] = $this->countryId;
    			$data['countrys'] = array($this->countryId);
    		}

    		$data['instanceId'] = $this->request->get('instance_id');
		    $data['id'] = $this->request->get('id');
    		$data['type'] = $this->request->get('type');

    		$data['page'] = $this->request->query->get('page', 1);
    		return $data;
    	}
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - getSubShopPromotionalProductsListAjax
     * Function created to get list of products for current subshop as per product criteria
     */
    public function getSubShopPromotionalProductsListAjax()
    {
    	$data = array();
    	$subShop = $this->getSubShop();

    	if ($subShop != 'SUBSHOP_NOT_FOUND') {

    		$subShopInstanceMeta = $this->subShopThemeManager->getSubShopInstanceKey('product_criteria', $subShop->getParentId());
    		$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $subShop->getParentId());
    		$subShopInstanceMeta = json_decode($subShopInstanceMeta->getMetaValue(), 'Array');
    		$subShopInstanceMetaThemeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');

			$productSearchData = new ProductSearchData($this->entityManager, $this->languageId);

	    	if (count($subShopInstanceMeta) > 0) {
	    		$searchQuery = $this->getSearchQuery($subShopInstanceMeta[$this->request->get('country')]);
			} else {
	    		$defaultProductCriteria = array("search_query" => "", "sku" => "", "min_price" => "", "max_price" => "" , "quantity" => "", "price_currency" => "","save_search_name" => "");
	    		$searchQuery = $this->getSearchQuery($defaultProductCriteria);
			}

	    	$searchQuery['product_search']['instanceId'] = count($subShopInstanceMeta) > 0 ? $subShop->getParentId() : $this->projectSetting['instance_id'];

	    	if($this->request->get('option') != "")
	    	{
	    		switch ($this->request->get('option')) {
	    			case "sku" :
	    				$searchQuery['product_search']['sku'] = $this->request->get('promotionalKeyword');
	    				break;
					case "supplier" :
	    				$searchQuery['product_search']['supplierName'][] = $this->request->get('promotionalKeyword');
	    				break;
                     case "keyword" :
                        $searchQuery['product_search']['keyword'] = $this->request->get('promotionalKeyword');
                        break;
					}
			}

	    	$form = $this->formManager->create(new ProductSearchType(), $productSearchData, array('csrf_protection' => false));

	    	$form->bind($searchQuery['product_search']);

	    	if ($form->isValid()) {

		    	$searchProducts = $this->searchManager->searchResult($form->getData(), false);

		    	if (count($searchProducts['search_result_array']['data']) > 0) {
		    		$page = $this->request->get('page', '1');
		    		$paginationData['data'] = $searchProducts['search_result_array']['data'];
		    		$paginationData['count'] = $searchProducts['search_result_array']['totalCount'];
		    		$paginationData['extra'] = 'extra';
		    		$data['pagination'] = $this->paginatorManager->paginate($paginationData, $page, $this->recordsPerPage);
		    	}

		    	$data['countryId'] = $this->request->get('country');
		    	$data['promotional_products_area'] = $subShopInstanceMetaThemeData['home_'.$this->request->get('type').'_products_area'][$this->request->get('country')];
		    	$data['type'] = $this->request->get('type');
		    	$data['instanceId'] = $this->request->get('instance_id');
		    	$data['id'] = $this->request->get('id');
		    	$data['totalCount'] = $searchProducts['search_result_array']['totalCount'];
                $data['selectedOption'] = $this->request->get('option');

		    	if (count($subShopInstanceMeta) > 0) {
		    		$data['countrys'] = array_keys($subShopInstanceMeta);
				} else {
		    		$data['countrys'] = array($this->countryId);
				}

		    	$data['selectedValues'] =  json_encode($subShopInstanceMetaThemeData['home_'.$this->request->get('type').'_products_area'][$this->request->get('country')]);
		    	$data['searchKeyword'] = $this->request->get('promotionalKeyword') ? $this->request->get('promotionalKeyword') : '';
		    	return $data;
			}
    	}
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - updateSubShopPromotionalProducts
     * Function created to update current subshop cms promotional products
     */
    public function updateSubShopPromotionalProducts()
    {
    	$subShop = $this->getSubShop();
    	$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $subShop->getParentId());
    	$themeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');

    	$themeData['home_'.$this->request->get('type').'_products_area'][$this->request->get('country')] = json_decode($this->request->get('productIds'));

    	$subShopInstanceMetaThemeData->setMetaValue(json_encode($themeData));

    	$this->subShopThemeManager->updateSubShopInstanceKey($subShopInstanceMetaThemeData);

    	$success = "Products updated successfully";

    	return $success;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - getSubShopBrands
     * Function created to set parameters while calling subshop brands ajax
     */
    public function getSubShopBrands()
    {
    	$data = array();

    	$param = $this->request->get('_route_params');

    	$activeCulture = ($param['language'])? $param['language'] : $this->default_language;;

    	$data['activeCulture'] = $activeCulture;

    	$data['instanceId'] = $this->request->get('id');

    	$data['page'] = $this->request->query->get('page', 1);

    	$data['search_query'] = $this->request->get('search_query', '');

    	return $data;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - getSubShopBrandsAjax
     * Function created to get list of current subshop brands with pagination
     */
    public function getSubShopBrandsAjax($brandApiManager,$paginator)
    {
    	$subShop = $this->getSubShop();

    	$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $subShop->getParentId());

    	$subShopInstanceMetaThemeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');

    	$returnData = array();
    	$culture = $this->request->get('language');

    	$searchQuery = $this->request->get('search_query', '');
    	$page = $this->request->get('page', '1');
    	$activeCulture = $culture;
    	$culture = array($culture);
    	$this->recordsPerPage = 10;
    	$brandData = $brandApiManager->getList($culture,array(),$searchQuery,'name','asc',$this->recordsPerPage,$page,1);

    	$returnBrandData = array();
    	if($brandData){
    		$returnBrandData = $brandData[$activeCulture];
    		$brandPaginationData['data'] = $brandData[$activeCulture];
    		$brandPaginationData['count'] = $brandData['count'];
    		$brandPaginationData['extra'] = 'extra';
    		$returnData['pagination'] = $paginator->paginate($brandPaginationData, $page, $this->recordsPerPage,array(), count($brandPaginationData['data']));
    	}
    	$returnData['activeCulture'] = $activeCulture;
    	$returnData['brandData'] = $returnBrandData;
    	$returnData['selectedValues'] = json_encode($subShopInstanceMetaThemeData['home_our_brands_area'][$this->request->get('language')]);
    	$returnData['brand_data'] = $subShopInstanceMetaThemeData['home_our_brands_area'][$this->request->get('language')];
    	$returnData['instanceId'] = $this->request->get('id');
    	$returnData['totalCount'] = $brandData['count'];
    	$returnData['searchQuery'] = $searchQuery;
    	return $returnData;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - updateSubShopBrands
     * Function created to update current cms subshop brands
     */
    public function updateSubShopBrands()
    {
    	$subShop = $this->getSubShop();
    	$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $subShop->getParentId());
    	$themeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');

    	$themeData['home_our_brands_area'][$this->request->get('language')] = json_decode($this->request->get('brandIds'));

    	$subShopInstanceMetaThemeData->setMetaValue(json_encode($themeData));

    	$this->subShopThemeManager->updateSubShopInstanceKey($subShopInstanceMetaThemeData);

    	$success = "Brands updated successfully";

    	return $success;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - frontGetBrands
     * Function created to get brands of current subshop instance
     */
    public function frontGetBrands($brandApiManager,$locale,$instanceId)
    {
    	$brands = array();
    	$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $instanceId);
    	if($subShopInstanceMetaThemeData){
    		$themeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');
    		if(isset($themeData['home_our_brands_area']))
    		{
    			$brands = $themeData['home_our_brands_area'][$locale];
    		}
    	}

    	$data=$brandApiManager->getList($locale,$brands);
		unset($brands);
    	return  $data;
    }

    /**
     * @author Employee Id: 4465
     * OB eCommerce Product - frontGetPromotionalProducts
     * Function created to get promotional products of current subshop instance
     */
    public function frontGetPromotionalProducts($productDetailManager,$locale,$countryId,$instanceId,$type)
    {
    	$products = array();
    	$productData = array();
    	$subShopInstanceMetaThemeData = $this->subShopThemeManager->getSubShopInstanceKey('theme_data', $instanceId);
    	if($subShopInstanceMetaThemeData){
    		$themeData = json_decode($subShopInstanceMetaThemeData->getMetaValue(), 'Array');
    		if(isset($themeData['home_'.$type.'_products_area'][$countryId])){
    			$products = $themeData['home_'.$type.'_products_area'][$countryId];
    		}
    	}

    	try{
    		$productData = $productDetailManager->getProductDetailById($products,$locale);
    	}catch(Exception $e){

    	}

    	unset($products);
    	return $productData;
    }

    /**
     * @author Employee Id: 4493
     * OB eCommerce Product - getStateWiseDistributorsSite
     * Function created to get state wise DistributorsSite List
     */
    public function getStateWiseDistributorsSite($page,$recordPerPage,$zipcode='')
    {
    	$stateArray = $this->entityManager->getRepository('OfficeBrainUserBundle:User')->getDistributorsState();
    	$distributorArray = array();
    	foreach ($stateArray as $key=>$val){
    		$distributorResult = $this->entityManager->getRepository('OfficeBrainSubShopBundle:SubShop')->getStateWiseDistributorsSiteDetail($val['stateId'],$page,$recordPerPage,$zipcode);
    		if($distributorResult){
    			$distributorArray[] = $distributorResult;
    		}
    	}
    	return $distributorArray;
    }
    
    /**
     * @author Employee Id: 4494
     */
    public function allowStepAccessConfiguration($subShop = array())
    {
    	$return  = 1;
    	if (count($subShop) > 0 && $this->projectSetting['user_id'] == $subShop->getCreatedUid() && count($this->request->get('project_user_setting')['user_data']->getParent()) == 0 && $this->request->get('project_user_setting')['user_data']->getUserType() == 'admin') {
    		$return = 0;
    	}

    	return $return;
	}

	/**
	 * @author Employee Id: 4494
	 */
	public function setSubShopInstanceConfiguration($instanceId) {
		$projectConfigurationMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:ProjectConfigurationMaster')->getAllConfigurationMasterObject();
		$instanceConfigurationRepository = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceConfiguration');
		$instanceMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->find($instanceId);

		if (count($instanceMaster) > 0) {
			foreach($projectConfigurationMaster as $projectConfiguration) {
				$instanceConfiguration = new InstanceConfiguration();
				$instanceConfiguration->setInstance($instanceMaster);
				$instanceConfiguration->setInstanceType($instanceMaster->getInstanceType());
				$instanceConfiguration->setModuleName($projectConfiguration->getModuleName());
				$instanceConfiguration->setSettings($projectConfiguration->getSettings());
				$instanceConfiguration->setCreatedAt(new \DateTime());
				$instanceConfigurationRepository->set($instanceConfiguration);
			}	
		}
	}
	
	/**
	 * @author Employee Id: 4494
	 */
	public function setDefaultServiceGroup($instanceId) {
		$serviceGroupRepository = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceGroup');
		$serviceGroupLanguageRepository = $this->entityManager->getRepository('OfficeBrainServiceGroupBundle:ServiceGroupLanguage');
		$instanceMaster = $this->entityManager->getRepository('OfficeBrainAccessManagementBundle:InstanceMaster')->find($instanceId);

		if (count($instanceMaster) > 0) {

			foreach($this->countries as $country) {
				$serviceGroup = new ServiceGroup();
				$serviceGroup->setCountryId($country['id']);
				$serviceGroup->setInstanceId($instanceId);
				$serviceGroup->setInstanceType($instanceMaster->getInstanceType());
				$serviceGroup->setStatus('1');
				$serviceGroup->setCreatedAt(new \DateTime());
				$serviceGroup->setUpdatedAt(new \DateTime());
				$serviceGroup->setCreatedUid($instanceMaster->getOwnerId());
				$serviceGroup->setUpdatedUid($instanceMaster->getOwnerId());
				$serviceGroup->setIsDefault('1');

				$serviceGroup = $serviceGroupRepository->set($serviceGroup);

				foreach($country['language'] as $languageSlug => $languageId) {
					$serviceGroupLanguage = new ServiceGroupLanguage();
					$serviceGroupLanguage->setServiceGroup($serviceGroup);
					$serviceGroupLanguage->setGroupName('REGULAR');
					$serviceGroupLanguage->setLanguageId($languageId);

					$serviceGroupLanguageRepository->set($serviceGroupLanguage);
				}
			}
		}
	}
}
