<?php

namespace OfficeBrain\Bundle\EmailBundle\Manager\Extended;

use OfficeBrain\Bundle\EmailBundle\Manager\AbstractManager\EmailEventAbstract;
use OfficeBrain\Bundle\EmailBundle\Entity\EmailUnsubscribedEvent;
use OfficeBrain\Bundle\EmailBundle\Entity\EmailEventMaster;
use OfficeBrain\Bundle\EmailBundle\Entity\EmailTemplateMaster;
use OfficeBrain\Bundle\EmailBundle\Entity\EmailTemplateLanguage;

/**
 * @author OfficeBrain 4795 <info@officebrain.com>
 *
 * Description: All custom and overrided methods
 */
class EmailEventExtended extends EmailEventAbstract
{
    public function __construct($container, $request)
    {
        parent::__construct($container, $request);
    }
    
    public function __destruct()
    {
        parent::__destruct();
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Set event data and store on DB
     *
     * @param 1 : EmailEvent Object.
     *
     * @return type : EmailEvent Object.
     *
     * @throws Exception: Null
     */
    public function setEvent($emailEvent)
    {
        $data = array();
        $emailEvent->setCreatedUid($this->createdUid);
        $emailEvent->setInstanceId($this->instanceId);
        $emailEvent->setInstanceType($this->instanceType);
        $emailEvent->setCreatedAt(new \DateTime());
        
        $eventKeyExist = $this->checkUniqueEventKey($emailEvent->getEventKey());
        if ($eventKeyExist) {
            $data['error'] = $this->translator->trans('email.event.message.add_error');
            return $data;
        }
                
        return $this->commit($emailEvent);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : check duplicate eventkey
     *
     * @param 1 : Event key.
     *
     * @return type : true or false.
     *
     * @throws Exception: Null
     */
    public function checkUniqueEventKey($eventKey)
    {
        if (count($this->eventRepo->checkEventKey($eventKey))>0) {
            return true;
        }
        return false;
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get all child event list
     *
     * @param 1 : Null
     *
     * @return type : Child event list
     *
     * @throws Exception: Null
     */
    public function getChildEventList()
    {
        return $this->eventRepo->findAllChild();
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get all master event list
     *
     * @param 1 : Null
     *
     * @return type : Master event list
     *
     * @throws Exception: Null
     */
    public function getMasterEventList()
    {
        return $this->eventRepo->findAllMaster();
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get all event list
     *
     * @param 1 : Null
     *
     * @return type : Event list
     *
     * @throws Exception: Null
     */
    public function getEventList($instanceId = '', $instanceType = '')
    {
        return $this->eventRepo->findAll($instanceId, $instanceType);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get single event object of requested ID
     *
     * @param 1 : Event id
     *
     * @return type : Even object
     *
     * @throws Exception: Null
     */
    public function getEvent($id, $instanceId = '', $instanceType = '')
    {
    	return $this->eventRepo->find($id, $instanceId, $instanceType);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get single event object of requested event_key
     *
     * @param 1 : Event key
     *
     * @return type : Even object
     *
     * @throws Exception: Null
     */
    public function getChildEventByEventKey($eventKey)
    {
        return $this->eventRepo->findByEventKey($eventKey);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get child event of perticular master
     *
     * @param 1 : Event Master id
     *
     * @return type : Child event list by master id
     *
     * @throws Exception: Null
     */
    public function getChildEventOfMaster($masterId, $keyword=null)
    {
        return $this->eventRepo->findChildOfMaster($masterId, $keyword);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Update event data of requested object
     *
     * @param 1 : Email event object
     *
     * @return type : Email event object
     *
     * @throws Exception: Null
     */
    public function updateEvent($emailEvent)
    {
        $emailEvent->setUpdatedUid($this->updatedUid);
        $emailEvent->setInstanceId($this->instanceId);
        $emailEvent->setInstanceType($this->instanceType);
        $emailEvent->setUpdatedAt(new \DateTime());
        $eventKeyExist = $this->checkUniqueEventKey($emailEvent->getEventKey());
        $event = $this->commit($emailEvent);
        
        //unset variable
        unset($emailEvent);
        unset($eventKeyExist);
        
        return $event;
    }
    
     /**
     * @author Employee Id: 4835
     *
     * Description : change status of event
     *
     * @param 1 : EmailEvent id
     
     * @return type : EmailEvent object.
     *
     * @throws Exception: Null
     */
    public function changeEventStatus($id)
    {
    	return $this->eventRepo->changeEventStatus($id);
    }
    /**
     * @author Employee Id: 4795
     *
     * Description : Soft delete requested master event
     *
     * @param 1 : Email master event id
     *
     * @return type : Null
     *
     * @throws Exception: Null
     */
    public function deleteMasterEvent($id)
    {
        $havingChild = $this->eventRepo->haveChild($id);
        $eventObj = null;
        if (count($havingChild) > 0) {
            $this->session->getFlashBag()->add('error_message', $this->translator->trans('email.event.message.delete_error2'));
        } else {
            $eventObj = $this->eventRepo->find($id);
            $currentDateTime = new \DateTime();
            $eventObj->setDeletedAt($currentDateTime);
            $eventObj->setDeletedUid($this->deletedUid);
            $eventObj->setEventKey($eventObj->getEventKey().'_'.$currentDateTime->format('Y-m-d H:i:s'));
            $this->commit($eventObj);
            $this->session->getFlashBag()->add('success_message', $this->translator->trans('email.event.message.delete_success'));
        }
        
        //unset variable
        unset($havingChild);
        unset($eventObj);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Soft delete requested child event
     *
     * @param 1 : Email child event id
     *
     * @return type : Null
     *
     * @throws Exception: Null
     */
    public function deleteChildEvent($id)
    {
        $eventObj = $this->eventRepo->find($id);
        /* if (!is_object($eventObj->getTemplate())) {
            $eventObj->setDeletedAt(new \DateTime());
            $this->commit($eventObj);
            $this->session->getFlashBag()->add('success_message', $this->translator->trans('email.event.message.delete_success'));
        } else {
            $this->session->getFlashBag()->add('error_message', $this->translator->trans('email.event.message.delete_error1'));
        } */
        
        $currentDateTime = new \DateTime();
        
        $eventObj->setDeletedAt($currentDateTime);
        $eventObj->setDeletedUid($this->deletedUid);
        $eventObj->setEventKey($eventObj->getEventKey().'_'.$currentDateTime->format('Y-m-d H:i:s'));
        $this->commit($eventObj);
        $this->session->getFlashBag()->add('success_message', $this->translator->trans('email.event.message.delete_success'));
        //unset variable
        unset($eventObj);
        unset($currentDateTime);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Search event based on keyword given in array
     *
     * @param 1 : Search query parameter array
     *
     * @return type : Event list
     *
     * @throws Exception: Null
     */
    public function searchEvent($dataArr)
    {
        $events = $this->eventRepo->searchEvent($dataArr);
        //$events = $this->eventRepo->findAll();
        
        foreach ($events as $key=>$val) {
            if ($val->getParentId() != null && $val->getParentId() != "") {
            
                $events[$key] = $this->getEvent($val->getParentId());
            }
        }
      //  echo "<pre>"; print_r($events);die;
        return array_unique($events);
        //return array_unique($events);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get all optional events
     *
     * @param 1 : Null
     *
     * @return type : Optional event list
     *
     * @throws Exception: Null
     */
    public function getOptionalEvents()
    {
        return $this->eventRepo->findOptional();
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Subscribe Unsubscribe user for event
     *
     * @param 1 : event id
     * @param 2 : subscribe or unsubscribe
     *
     * @return type : Null
     *
     * @throws Exception: Null
     */
    public function eventSubscription($id, $subscription)
    {
        if ($subscription == "unsubscribe") {
            $eventUnsubscribe = new EmailUnsubscribedEvent();
            $eventUnsubscribe->setInstanceId($this->instanceId);
            $eventUnsubscribe->setInstanceType($this->instanceType);
            $eventUnsubscribe->setUserId($this->userId);
            $eventUnsubscribe->setEventId($id);
            $this->commit($eventUnsubscribe);
        } else {
            $eventUnsubscribe = $this->eventUnsubscribeRepo->findUnsubscribedEvent($id, $this->userId);
            if (is_object($eventUnsubscribe)) {
                $this->remove($eventUnsubscribe);
            }
        }
        
        //unset variable
        unset($eventUnsubscribe);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get unsubscribed event of user
     *
     * @param 1 : Event id
     *
     * @return type : Unsubscribe event
     *
     * @throws Exception: Null
     */
    public function getUnsubscribedEvent($eventId)
    {
        return $this->eventUnsubscribeRepo->findUnsubscribedEvent($eventId, $this->userId);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get unsubscribed events of user
     *
     * @param 1 : Null
     *
     * @return type : Unsubscribe event list
     *
     * @throws Exception: Null
     */
    public function getUnsubscribedEvents()
    {
        return $this->eventUnsubscribeRepo->getUnsubscribedEvents($this->userId);
    }

    /**
     * @author Employee Id: 4494
     *
     * Description : Clone Email Data By Instance Id
     *
     * @param 1 : Null
     *
     * @return type : Clone Email data
     *
     * @throws Exception: Null
     */
    public function cloneEmailData($sourceEmailEvents, $targetInstanceId, $targetInstanceType) {
    	$parentMapping = array();
    	foreach($sourceEmailEvents as $emailEvent) {
    		$emailEventMaster = new EmailEventMaster();
    		$emailEventMaster->setInstanceType($targetInstanceType);
    		$emailEventMaster->setInstanceId($targetInstanceId);
    		$emailEventMaster->setCountryId($emailEvent->getCountryId());
    		$emailEventMaster->setName($emailEvent->getName());
    		$emailEventMaster->setDescription($emailEvent->getDescription());
    		$emailEventMaster->setEventKey($emailEvent->getEventKey());
    		$emailEventMaster->setParentId($emailEvent->getParentId());

    		$emailEventMaster->setPriority($emailEvent->getPriority());
    		$emailEventMaster->setSubject($emailEvent->getSubject());
    		
    		if (count($emailEvent->getTemplate()) > 0) {
    			
    			$emailTemplateMaster = $this->templateRepo->cloneEmailTemplateMaster($emailEvent->getTemplate());
    			
    			$emailTemplateMaster->setInstanceType($targetInstanceType);
    			$emailTemplateMaster->setInstanceId($targetInstanceId);
    			$emailTemplateMaster->setCreatedAt(new \DateTime());
    			$emailTemplateMaster = $this->commit($emailTemplateMaster);
    			
    			foreach($emailEvent->getTemplate()->getContent() as $emailTemplateContent) {
    				$emailTemplateLanguage = new EmailTemplateLanguage();
    				$emailTemplateLanguage->setTemplateId($emailTemplateMaster);
    				$emailTemplateLanguage->setLanguageId($emailTemplateContent->getLanguageId());
    				$emailTemplateLanguage->setTemplateContent($emailTemplateContent->getTemplateContent());

    				$this->commit($emailTemplateLanguage);
    			}

    			$emailEventMaster->setTemplate($emailTemplateMaster);
    		} else {
    			$emailEventMaster->setTemplate($emailEvent->getTemplate());
    		}
    		
    		$emailEventMaster->setIsOptional($emailEvent->getIsOptional());
    		$emailEventMaster->setSendtoUser($emailEvent->getSendtoUser());
    		$emailEventMaster->setSendtoAdmin($emailEvent->getSendtoAdmin());
    		$emailEventMaster->setToEmail($emailEvent->getToEmail());
    		$emailEventMaster->setReplyToEmail($emailEvent->getReplyToEmail());
    		$emailEventMaster->setFromName($emailEvent->getFromName());
    		$emailEventMaster->setFromEmail($emailEvent->getFromEmail());
    		$emailEventMaster->setCcEmail($emailEvent->getCcEmail());
    		$emailEventMaster->setBccEmail($emailEvent->getBccEmail());
    		$emailEventMaster->setStatus($emailEvent->getStatus());
    		$emailEventMaster->setCreatedUid($emailEvent->getCreatedUid());
    		$emailEventMaster->setCreatedAt(new \DateTime());
    		$emailEventMaster->setUpdatedUid($emailEvent->getUpdatedUid());
    		$emailEventMaster->setUpdatedAt(new \DateTime());
    		$emailEventMaster->setDeletedUid($emailEvent->getDeletedUid());
    		$emailEventMaster->setDeletedAt($emailEvent->getDeletedAt());

    		$emailEventMaster = $this->commit($emailEventMaster);

    		$parentMapping[$emailEvent->getId()] = $emailEventMaster->getId();
    	}

    	if (count($parentMapping) > 0) {
    		$targetEmailEvents = $this->getEventList($targetInstanceId, $targetInstanceType);

    		foreach ($targetEmailEvents as $emailEventMaster) {
    			if (count($emailEventMaster->getParentId()) > 0 && isset($parentMapping[$emailEventMaster->getParentId()->getId()])) {
    				$parentEvent = $this->getEvent($parentMapping[$emailEventMaster->getParentId()->getId()], $targetInstanceId, $targetInstanceType);

    				$emailEventMaster->setParentId($parentEvent);

    				$this->commit($emailEventMaster);
    			}
    		}

    		return $targetEmailEvents;
    	}
    }
}
