<?php

namespace OfficeBrain\Bundle\CmsBundle\Manager\Extended;

use OfficeBrain\Bundle\CmsBundle\Manager\AbstractManager\CmsPageAbstract as CmsPageAbstract;
use OfficeBrain\Bundle\CmsBundle\Entity\CmsPageMaster;
use OfficeBrain\Bundle\CmsBundle\Entity\CmsPageLanguage;

class CmsPageExtended extends CmsPageAbstract
{
    public function __construct($entityManager, $request, $paginatorManager, $countries, $languages)
    {
        parent::__construct($entityManager, $request, $paginatorManager, $countries, $languages);
    }

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

    /**
     * @author Employee Id: 4795
     * Description : Get blank object of master entity
     *
     * @return object
     * */
    public function getCmsPageMasterWithLanguage()
    {
        $cmsPageMaster = new CmsPageMaster();

        foreach ($this->languages as $key => $value) {
            $cmsPageLanguage = new CmsPageLanguage();
            $cmsPageLanguage->setLanguageId($value['id']);
            $cmsPageMaster->getlanguageMapping()[] = $cmsPageLanguage;
        }

        return $cmsPageMaster;
    }

    /**
     * @author Employee Id: 4494
     * Description : get all pages
     *
     * @return object
     * */
    public function getCmsPageList()
    {
        $data = array();

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

        if ($countryId == '') {
            $countryId = $this->countryId;
        }

        $cmsPageMasters = $this->cmsPageMasterRepository->findByCountryId($countryId);

        if (count($cmsPageMasters) > 0) {
            $data['pagination'] = $this->paginatorManager->paginate($cmsPageMasters, $this->request->get('page'), $this->recordsPerPage, array(), count($cmsPageMasters));
        }

        $data['records_per_page'] = $this->recordsPerPage;
        $data['page'] = $this->request->get('page');
        $data['countryId'] = $countryId;

        return $data;
    }

    /**
     * @author Employee Id: 4494
     * Description : get all active pages
     *
     * @return object
     * */
    public function getCmsActivePageList($countryId = 0)
    {
        if ($countryId == 0) {
            $countryId = $this->countryId;
        }

        return $this->cmsPageMasterRepository->findActiveByCountryId($countryId);
    }

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

        $cmsPageMasters = $this->cmsPageMasterRepository->getPageBySlug($this->request->get('slug'), $this->countryId, $this->languageId);
        
        if (empty($cmsPageMasters)) {
            //throw $this->createNotFoundException('Unable to find page.');
            $data['error'] = "PAGE_NOT_FOUND";
        } else {
            $data = $cmsPageMasters[0];
            
            if ($this->projectSetting['user_id'] == $data['createdUid']) {
                $data['inline_edit'] = false; //Set false temporarily to turn of inline editing as this functionality yet to be done.
            }
        }
        
        return $data;
    }
       
    /**
     * @author Employee Id: 4571
     * Description : Filter form data
     *
     * @return object
     * */
    public function filterFormData($form, $translator)
    {
        $cmsPageMaster = $form->getData();
         
        $data = array();
        $countryId = $cmsPageMaster->getCountryId();
        if ($countryId) {
            $countryCode = $this->getCountryField($countryId, 'id', 'code');
    
            foreach ($cmsPageMaster->getLanguageMapping() as $key => $language) {
                if (!in_array($language->getLanguageId(), $this->countries[$countryCode]['language'])) {
                    unset($cmsPageMaster->getLanguageMapping()[$key]);
                } else {
                    if ($language->getPageTitle() == '') {
                        $form->get('languageMapping')[$key]->get('pageTitle')->addError(new \Symfony\Component\Form\FormError($translator->trans('cms.admin.form.page.label.required')));
                    }
                }
            }
        }
    
        return $form;
    }
    

    /**
     * @author Employee Id: 4795
     * Description : Get country field
     * */
    public function getCountryField($culture, $searchField, $returnField)
    {
        foreach ($this->countries as $key => $country) {
            if ($culture == $country[$searchField]) {
                if ($returnField != 'code') {
                    return $country[$returnField];
                } else {
                    return $key;
                }
            }
        }
    }

    /**
     * @author Employee Id: 4795
     * Description : Save page data to database
     *
     * @return object
     * */
    public function setCmsPage($cmsPageMaster, $mode='')
    {
        $cmsPageMasterId = $cmsPageMaster->getId();
        $countryId = $cmsPageMaster->getCountryId();
        $slug = $cmsPageMaster->getSlug();
        
        $cnt = $this->cmsPageMasterRepository->findCount($slug, $countryId);
                 
        if (($cnt > 0) && $mode!="edit") { // duplicate slug
           return 'ERROR_SLUG_ALREADY_EXISTS';
        }
             
        if ($cmsPageMasterId == '') {
            $cmsPageMaster->setCreatedUid($this->projectSetting['user_id']);
            $cmsPageMaster->setInstanceId($this->projectSetting['instance_id']);
            $cmsPageMaster->setInstanceType($this->projectSetting['instance_type']);
            $cmsPageMaster->setCreatedAt(new \DateTime());
        }

        $languageMapping = $cmsPageMaster->getLanguageMapping();

        $cmsPageMaster = $this->cmsPageMasterRepository->set($cmsPageMaster);

        if ($cmsPageMasterId == '') {
            foreach ($languageMapping as $language) {
                $language->setPageId($cmsPageMaster);
                $this->cmsPageLanguageRepository->set($language);
            }

            $this->createCopyCmsPage(clone $cmsPageMaster);
        }

        return $cmsPageMaster;
    }

    /**
     * @author Employee Id: 4795
     * Description : Create a copy of page
     *
     * @return object
     * */
    public function createCopyCmsPage($cmsPageMaster)
    {
        $makeCopyCountry = $this->request->get('make_copy_country');
        $makeCopyStatus = $this->request->get('make_copy_status');

        if ($makeCopyCountry) {
            foreach ($makeCopyCountry as $countryId => $value) {
                $cmsPageMaster->setId(null);

                $cmsPageMaster->setStatus(isset($makeCopyStatus[$countryId]) ? true : false);
                $cmsPageMaster->setCountryId($countryId);

                $countryCode = $this->getCountryField($countryId, 'id', 'code');

                $pageSlug = $cmsPageMaster->getSlug();

                $cmsPageMaster->setSlug($this->copyPageSlug($pageSlug));

                foreach ($this->countries[$countryCode]['language'] as $languageId) {
                    $pageLanguageCopy = new CmsPageLanguage();
                    $pageLanguageCopy->setLanguageId($languageId);
                    $pageLanguageCopy->setPageTitle('Copy of - '.$cmsPageMaster->getLanguageMapping()->first()->getPageTitle());
                    $pageLanguageCopy->setPageContent($cmsPageMaster->getLanguageMapping()->first()->getPageContent());
                    $pageLanguageCopy->setMetaTitle($cmsPageMaster->getLanguageMapping()->first()->getMetaTitle());
                    $pageLanguageCopy->setMetaKeyword($cmsPageMaster->getLanguageMapping()->first()->getMetaKeyword());
                    $pageLanguageCopy->setMetaDescription($cmsPageMaster->getLanguageMapping()->first()->getMetaDescription());
                    $pageLanguageCopy->setPageId($cmsPageMaster);
                    $cmsPageMaster->addLanguageMapping($pageLanguageCopy);
                }

                $this->cmsPageMasterRepository->set($cmsPageMaster);
                $cmsPageMaster = clone $cmsPageMaster;
            }
        }
    }

    /**
     * @author Employee Id: 4795
     * Description : Copy page
     * */
    public function copyCmsPage()
    {
        $cmsPageMaster = $this->cmsPageMasterRepository->find($this->request->get('page_id'));

        if ($cmsPageMaster) {
            $this->createCopyCmsPage(clone $cmsPageMaster);
        }

        return true;
    }

    /**
     * @author Employee Id: 4795
     * Description : Find page of object
     *
     * @return object
     * */
    public function getCmsPageById($id = 0)
    {
    	if ($id == 0) {
    		$id = $this->request->get('id');
    	}

        return $this->cmsPageMasterRepository->find($id);
    }

    /**
     * @author Employee Id: 4795
     * Description : Update page data to database
     *
     * @return object
     * */
    public function updateCmsPage($cmsPageMaster)
    {
        $cmsPageMaster->setUpdatedUid($this->projectSetting['user_id']);
        $cmsPageMaster->setUpdatedAt(new \DateTime());

        return $this->setCmsPage($cmsPageMaster, "edit");
    }

    /**
     * @author Employee Id: 4795
     * Description : Copy slug
     * */
    public function copyPageSlug($slug)
    {
        $slugExist = $this->cmsPageMasterRepository->getCountSlugExist($slug);
        if ($slugExist != 0) {
            $slug = $slug.'_copy';

            return $this->copyPageSlug($slug);
        } else {
            return $slug;
        }
    }

    /**
     * @author Employee Id: 4795
     * Description : Soft delete of page
     *
     * @return object
     * */
    public function deleteCmsPage()
    {
        $pageObj = $this->cmsPageMasterRepository->find($this->request->get('id'));

        if (is_object($pageObj)) {
            $pageObj->setDeletedAt(new \DateTime());
            $pageObj->setDeletedUid($this->projectSetting['user_id']);

            return $this->cmsPageMasterRepository->set($pageObj);
        }
    }

    /**
     * @author Employee Id: 4795
     * Description : Preview page
     *
     * @return array
     * */
    public function previewCmsPage()
    {
        $data = array();
        $data['slug'] = $this->request->get('slug');
        $data['pageTitle'] = $this->request->get('pageTitle');
        $data['pageContent'] = $this->request->get('pageContent');
        $data['metaTitle'] = $this->request->get('metaTitle');
        $data['metaKeyword'] = $this->request->get('metaKeyword');
        $data['metaDescription'] = $this->request->get('metaDescription');
        $data['templateSlug'] = $this->request->get('templateSlug');
        $data['css'] = $this->request->get('css');

        return $data;
    }

    public function searchCmsPage()
    {
        $data = array();
        $countryId = $this->request->get('countryId');
        $option = $this->request->get('option');
        $keyword = $this->request->get('keyword');

        $cmsPageMasters = $this->cmsPageMasterRepository->findByOption($countryId, $option, $keyword);

        if (count($cmsPageMasters) > 0) {
            $data['pagination'] = $this->paginatorManager->paginate($cmsPageMasters, $this->request->get('page'), $this->recordsPerPage, array(), count($cmsPageMasters));
        }

        $data['records_per_page'] = $this->recordsPerPage;
        $data['page'] = $this->request->get('page');
        $data['countryId'] = $countryId;

        return $data;
    }

    /**
     * @author Employee Id: 4589
     * Description : Update page data to database from inline
     *
     * @return bool
     * */
    public function updateCmsPageInline()
    {
        $cmsPageMaster = $this->cmsPageMasterRepository->findBySlugAndCountry($this->request->get('slug'), $this->countryId);
        if ($cmsPageMaster) {
            $pageTitle = $this->request->get('title');
            $pageContent = $this->request->get('content');

            if ($pageTitle != '' and $pageContent != '' and $this->projectSetting['user_id'] == $cmsPageMaster->getCreatedUid()) {
                $cmsPageLanguages = $cmsPageMaster->getLanguageMapping();
                $isEdit = false;
                foreach ($cmsPageLanguages as $cmsPageLanguage) {
                    if ($cmsPageLanguage->getLanguageId() == $this->languageId) {
                        $cmsPageLanguage->setPageTitle($pageTitle);
                        $cmsPageLanguage->setPageContent($pageContent);
                        $isEdit = true;
                    }
                }
                if ($isEdit) {
                    $cmsPageMaster->setUpdatedUid($this->projectSetting['user_id']);
                    $cmsPageMaster->setUpdatedAt(new \DateTime());

                    return $this->cmsPageMasterRepository->set($cmsPageMaster);
                }
            }
        }

        return false;
    }
    
    /**
     * @author Employee Id: 4464
     * Description : Save static page to database while creating menu
     *
     * @return object
     * */
    public function setCmsPageFromStaticPage($data = array())
    {
        $cmsPageMasterId = !empty($data['id']) ? $data['id'] : '';
        $countryId = $data['country_id'];
        $languageId = $data['language_id'];
        $slug = $data['slug'];
        $label = $data['label'];
        
        $cmsPageMaster = new CmsPageMaster();
    
        $slugAlreadyExists = $this->cmsPageMasterRepository->findBySlugAndCountry($slug, $countryId);
         
        if (!empty($slugAlreadyExists)) { // duplicate slug
            return $slugAlreadyExists;
        }
         
        if ($cmsPageMasterId == '') {
            $cmsPageMaster->setSlug($slug);
            $cmsPageMaster->setCountryId($countryId);
            $cmsPageMaster->setCreatedUid($this->projectSetting['user_id']);
            $cmsPageMaster->setInstanceId($this->projectSetting['instance_id']);
            $cmsPageMaster->setInstanceType($this->projectSetting['instance_type']);
            $cmsPageMaster->setCreatedAt(new \DateTime());
            
            foreach ($this->languages as $key => $value) {
                $cmsPageLanguage = new CmsPageLanguage();
                $cmsPageLanguage->setLanguageId($value['id']);
                $cmsPageMaster->getlanguageMapping()[] = $cmsPageLanguage;
            }
        }
        
        if ($countryId) {
            $countryCode = $this->getCountryField($countryId, 'id', 'code');
        
            foreach ($cmsPageMaster->getLanguageMapping() as $key => $language) {
                if (!in_array($language->getLanguageId(), $this->countries[$countryCode]['language'])) {
                    unset($cmsPageMaster->getLanguageMapping()[$key]);
                } else {
                    if ($language->getPageTitle() == '') {
                        $language->setPageTitle($label);
                    }
                }
            }
        }
        
        $languageMapping = $cmsPageMaster->getLanguageMapping();
        
        $cmsPageMaster = $this->cmsPageMasterRepository->set($cmsPageMaster);
        
        if ($cmsPageMasterId == '') {
            foreach ($languageMapping as $language) {
                $language->setPageId($cmsPageMaster);
                $this->cmsPageLanguageRepository->set($language);
            }
        }
        
        return $cmsPageMaster;
    }
    
    /**
     * @author Employee Id: 5058
     * Description : Change Cms Page Status
     *
     * @return object
     * */
    public function changeStatus($id)
    {
    	return $this->cmsPageMasterRepository->changeStatus($id);
    }
    
    /**
     * @author Employee Id: 4465
     * Description : set static page for subshop cms theme by default
     *
     * @return object
     * */
    public function cmsSetStaticPage($instanceId,$themeData,$instanceType)
    {
    	
		foreach($this->countries as $countries){
			$cmsPageMaster = new CmsPageMaster();
			$cmsPageMaster->setSlug($themeData['slug']);
			$cmsPageMaster->setInstanceId($instanceId);
			$cmsPageMaster->setInstanceType($instanceType);
			$cmsPageMaster->setCountryId($countries['id']);
			$cmsPageMaster->setStatus(1);
			$cmsPageMaster->setCreatedUid($this->projectSetting['user_id']);
			$cmsPageMaster->setCreatedAt(new \DateTime());
			$cmsPageMaster->setUpdatedAt(new \DateTime());
			$this->cmsPageMasterRepository->set($cmsPageMaster);
			$this->entityManager->flush();
			
			$cmsPageMasterId = $cmsPageMaster->getId();
			
			foreach($countries['language'] as $languageKey=>$languageValue){
		    	$cmsPageLanguage = new CmsPageLanguage();
		    	$cmsPageLanguage->setPageId($this->cmsPageMasterRepository->findPage($cmsPageMasterId));
		    	$cmsPageLanguage->setLanguageId($languageValue);
		    	$cmsPageLanguage->setPageTitle($themeData['title']);
		    	$cmsPageLanguage->setPageContent($themeData['content']);
		    	$this->cmsPageLanguageRepository->set($cmsPageLanguage);
		    	$this->entityManager->flush();
			}
		}
		return $cmsPageMasterId;
    }
    
    /**
     * @author Employee Id: 4465
     * Description : for site-search
     *
     * */
    public function siteSearch($request)
    {
    	$siteSearch['page']  =  $request->query->get('page', 1);
    	$siteSearch['search'] = $request->get('search','');
    	
    	return $siteSearch;
    }
    
    /**
     * @author Employee Id: 4465
     * Description : list of site-search
     *
     * */
    public function getSiteSearchList($request)
    {

    	$siteSearchList = $this->cmsPageMasterRepository->getSiteSearchList($request->get('search'),$this->countryId,$this->languageId);
    	
    	$siteSearchListArray['totalCount'] = count($siteSearchList);
    	
    	$siteSearchListArray['pagination'] =  $this->paginatorManager->paginate($siteSearchList, $request->get('page', '1'), $this->recordsPerPage, array(), count($siteSearchList));
    	
    	unset($siteSearchList);
    	
    	return $siteSearchListArray;
    }
}
