<?php
namespace OfficeBrain\Bundle\EmailBundle\Manager\Extended;

use OfficeBrain\Bundle\EmailBundle\Manager\AbstractManager\EmailServiceAbstract;
use OfficeBrain\Bundle\EmailBundle\Entity\EmailTemplateLanguage;
use OfficeBrain\Bundle\EmailBundle\Document\EmailQueue;

/**
 *
 * @author OfficeBrain 4795 <info@officebrain.com>
 *
 * Description: All custom and overrided methods
 *
 */
class EmailServiceExtended extends EmailServiceAbstract
{
    /**
     *
     * @author Employee Id: 4795
     *
     * Description : Set variables
     *
     * @param $entityManager
     * @param $request
     */
    public function __construct($container, $request, $countries, $languages)
    {
        parent::__construct($container, $request, $countries, $languages);
    }
    
    public function __destruct()
    {
        parent::__destruct();
    }
    
    /** Email Sending and Queue management */
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Push mail data in mongodb queue by replacing dynamic parameters
     *
     * @param $to
     * @param $from
     * @param $eventKey
     * @param $culture
     * @param $params
     * @return
     */
    public function sendMail($eventKey, $to = "", $params = array(), $culture = null, $from = null, $subject = null, $attachment = null, $cc = null, $bcc = null)
    {
        $emailEventManager = $this->container->get('office_brain_email_event_manager');
        $emailTemplateManager = $this->container->get('office_brain_email_template_manager');
        
       
        $this->culture = $this->cultureCode;
        $this->getCultureValue();
            
        $this->countryId = $this->getCountryIdByCode($this->countryCode);
        $this->languageId = $this->getLanguageIdByCode($this->languageCode);
        
        $culture = $this->languageId;
         
        $event = $emailEventManager->getChildEventByEventKey(trim($eventKey));
        /*if (is_array($event) || $event instanceof Countable) {
            $count = count($event);
        } else {
            $count = 1; //or handle the case when it's not countable
        }*/
        if ($event) {
            $unsubscribed = $emailEventManager->getUnsubscribedEvent($event->getId());
            if (count($unsubscribed) > 0) {
                return $this->translator->trans('email.event.message.unsubscribed');
            }
            if ($event->getTemplate()->getStatus() == 0) {
                return $this->translator->trans('email.template.message.not_found');
            }
            $templateContent = $emailTemplateManager->getTemplateContentByLanguage($event->getTemplate()->getId(), $culture);
            $html = $templateContent['templateContent'];
            
            $masterEvent = $emailEventManager->getEvent($event->getParentId());
            
            if (is_object($event->getTemplate()->getHeader())) {
                
                $headerId = $event->getTemplate()->getHeader()->getId();
            } else {
               
                $headerId = "";
            }
            $html = $emailTemplateManager->getPreviewTemplateData($html, $culture, $headerId);
           
            $html = $emailTemplateManager->replaceDynamicParams($html, $params);
            
            if ($from == null || $from == "") {
                $from = $event->getFromEmail();
            }
            
            if ($event->getFromName() != null) {
                $fromName = $event->getFromName();
            }
            
            $sendToAdmin = 0;
            $sendToAdminEmail = '';
            if ($event->getSendtoAdmin() != null) {
                $sendToAdmin = $event->getSendtoAdmin();
                
                $sendToAdminEmail = $this->projectSetting['admin_email'];
            }
            
            $sendToUser = 0;
            $sendToUserEmail = '';
            if ($event->getSendtoUser() != null) {
                $sendToUser = $event->getSendtoUser();
                if($event->getSendtoUser())
                {
                    $userData = $this->request->get('project_user_setting');
                    if(isset($userData['user_data']))
                    {
                        if($userData['user_data']->getEmail() != '')
                        {
                            $sendToUserEmail = $userData['user_data']->getEmail();
                        }
                    }
                }
            }
            
            // Collect all three, "to" addresses in one single variable
            $toAddresses = array();
            if (is_array($to) && (!empty($to))) {
                $toAddresses = $to;
            }
            else if((!empty($to)))
            {
                $toAddresses[] = $to;
            }
            
            if(($to == null || $to == "" || empty($to)) && $event->getToEmail())
            {
                $toAddresses[] = $event->getToEmail();
            }
            if($sendToAdminEmail != '')
            {
                $toAddresses[] = $sendToAdminEmail;
            }
            if($sendToUserEmail!= '')
            {
                $toAddresses[] = $sendToUserEmail;
            }
            
            // Make the to email comma separated
            $to = implode(',', $toAddresses);
            
            if ($cc == null || $cc == "") {
                $cc = $event->getCcEmail();
            } elseif (is_array($cc)) {
                $cc = implode(',', $cc);
            }
            
            if ($bcc == null || $bcc == "") {
                $bcc = $event->getBccEmail();
            } elseif (is_array($bcc)) {
                $bcc = implode(',', $bcc);
            }
            
            if ($subject == null || $subject == "") {
                $subject = $event->getSubject();
            }
            if (is_array($attachment)) {
                $attachment = implode(",", $attachment);
            }
            
            try {
                $emailQueue = new EmailQueue();
            } catch (Exception $e) {
                $isSent = $this->send($to, $from, $subject, $html, $cc, $bcc, explode(",", $attachment), $event->getReplyToEmail(), '',$fromName);
                var_dump($isSent);    
                if ($isSent) {
                    $logArr[$value->getId()] = "Success";
                    return true;
                } else {
                    $logArr[$value->getId()] = "Failed";
                    return false;                    
                }
            }
            
           
            $emailQueue->setInstanceId($this->instanceId);
            $emailQueue->setInstanceType($this->instanceType);
            $emailQueue->setEvent($event->getName());
            $emailQueue->setTo($to);
            $emailQueue->setFrom($from);
            $emailQueue->setFromName($fromName);
            $emailQueue->setFromAdm($sendToAdmin);
            $emailQueue->setCc($cc);
            $emailQueue->setBcc($bcc);
            $emailQueue->setReplyTo($event->getReplyToEmail());
            $emailQueue->setSubject($subject);
            $emailQueue->setContent($html);

            if($attachment)
            {
                $emailQueue->setAttachment($attachment);
            }
            $emailQueue->setType($masterEvent->getName());
            $emailQueue->setPriority($event->getPriority());
            $emailQueue->setSendAt(new \DateTime());

            $this->commitDocument($emailQueue);
            return true;            
            
        } else {
            return false;            
        }
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Search emails
     *
     */
    public function searchedEmailList($dataArr)
    {
        return $this->emailQueueRepo->searchEmails($dataArr);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Send email to client
     *
     */
    public function send($to, $from, $subject, $html, $cc = "", $bcc = "", $attachment = null, $replyTo = "",$inlineAttachments = false,$fromName = false)
    {
        
        $toArr = explode(',', $to);
        $ccArr = explode(',', $cc);
        $bccArr = explode(',', $bcc);
        if (isset($to) && $to != "") {
            foreach ($toArr as $to)
            {
                $this->addTo($to, "");
            }
        }
        if (isset($cc) && $cc != "") {
            foreach ($ccArr as $cc)
            {
                $this->addCc($cc, "");
            }
        }
        if (isset($bcc) && $bcc != "") {
            foreach ($bccArr as $bcc)
            {
                $this->addBcc($bcc, "");
            }
        }
        if (isset($replyTo) && $replyTo != "") {
            $this->addReplyTo($replyTo, "");
        }
        
        //$from         = (isset($from) && $from != "")?$from:$this->container->getParameter('mailer_user');
        //$fromName = (isset($fromName) && $fromName != "")?$fromName:$this->container->getParameter('mailer_user_name');

        $from       = $this->container->getParameter('webmaster_email');
        $fromName   = $this->container->getParameter('webmaster_name');


        $this->addFrom($from, $fromName);
      
        if(isset($attachment) ){
            foreach($attachment as $attach){
           if($attach != ''){
            $this->addAttachment($attach,$inlineAttachments);
           }
            }
        }
        

        $this->setSubject($subject);
        
        //parse template and save it to Mesage variable
        
        // @todo need to refactor this mode base logic
        
            $this->getMessageInstance()->setSubject($this->subject)->setBody($html);
       
        if (count($this->to) == 0 && count($this->cc) == 0 && count($this->bcc) == 0) {
            return "Please specify at least one To address";
        }
           //$this->addFrom($this->from[0], $this->from[1]);

        // set TO address
        foreach ($this->to as $emailAddress => $name) {
            $this->getMessageInstance()->addTo($emailAddress, $name);
        }

        // set CC address
        foreach ($this->cc as $emailAddress => $name) {
            $this->getMessageInstance()->addCc($emailAddress, $name);
        }

        // set BCC address
        foreach ($this->bcc as $emailAddress => $name) {
            $this->getMessageInstance()->addBcc($emailAddress, $name);
        }
        
        // set REPLY TO address
        foreach ($this->replyTo as $emailAddress => $name) {
            $this->getMessageInstance()->setReplyTo($emailAddress, $name);
        }
        
        // set attachment object
        foreach ($this->attachment as $key => $attachmentObj) {  
            $this->getMessageInstance()->attach($attachmentObj);
        }
        
        try {
            $retValue = $this->getMailerService()->send($this->getMessageInstance());
        } catch (Exception $e) {
            echo $e->getMessage();
        }
        
        //if debug mode is on than we will are not able to send email.
       /*  if ($this->container->hasParameter('mailer_debug_mode') && $this->container->getParameter('mailer_debug_mode')==true) {
            $debugArray = array('body'=>$this->message, 'subject'=>$this->subject, 'to'=>$this->to, 'cc'=>$this->cc, 'bcc'=>$this->bcc);
            error_log(var_export($debugArray, 1), 3, $this->container->get('kernel')->getRootDir().DIRECTORY_SEPARATOR.'logs'.DIRECTORY_SEPARATOR.'test_email.log');
        } */

            $this->clearAddress();
        

        return is_object($retValue) ? ($retValue->message=="success"?true:false) : $retValue;
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Get all queued email list
     *
     */
    public function getQueuedEmailList()
    {
        return $this->emailQueueRepo->findAll();
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Release all emails priority vise
     *
     */
    public function releaseEmails()
    {
        $emails = $this->emailQueueRepo->findUnsendEmails();
        $logArr = array();
        
        foreach ($emails as $key=>$value) {
            $link = $this->projectSetting['base_url'].$this->container->get('router')->generate('office_brain_emailbundle_emailqueueadmin_reademail', array('id'=>$value->getId()));
            $html = $value->getContent()."<img src = ".$link." />";
            $isSent = $this->send($value->getTo(), $value->getFrom(), $value->getSubject(), $html, $value->getCc(), $value->getBcc(), explode(",", $value->getAttachment()), $value->getReplyTo(), '', $value->getFromName());
            //echo $value->getPriority();
    
            if ($isSent) {
                if ($value->getFromAdm() != null && $value->getFromAdm() == 1) {
                    $this->send($this->projectSetting['admin_email'], $value->getFrom(), $value->getSubject(), $html, $value->getCc(), $value->getBcc(), explode(",", $value->getAttachment()), $value->getReplyTo(), '', $value->getFromName());
                }
                $value->setIsSent('1');
                $this->commitDocument($value);
                $logArr[$value->getId()] = "Success";
            } else {
                $logArr[$value->getId()] = "Failed";
            }
        }
        //$this->session->getFlashBag()->add('success_message', $this->translator->trans('email.message.release_success'));
     
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Resend email
     *
     */
    public function resendEmail($id)
    {
        $email = $this->emailQueueRepo->find($id);
        $link = $this->projectSetting['base_url'].$this->container->get('router')->generate('office_brain_emailbundle_emailqueueadmin_reademail', array('id'=>$email->getId()));
        $html = $email->getContent()."<img src = ".$link." />";
        $isSent = $this->send($email->getTo(), $email->getFrom(), $email->getSubject(), $html, $email->getCc(), $email->getBcc(), explode(",", $email->getAttachment()), $email->getReplyTo(), '', $email->getFromName());
        if ($isSent) {
            if ($email->getFromAdm() != null && $email->getFromAdm() == 1) {
                $this->send($this->projectSetting['admin_email'], $email->getFrom(), $email->getSubject(), $html, $email->getCc(), $email->getBcc(), explode(",", $email->getAttachment()), $email->getReplyTo(), '', $email->getFromName());
            }
            $email->setResend('1');
            $this->commitDocument($email);
            $this->session->getFlashBag()->add('success_message', $this->translator->trans('email.message.resend_success'));
        } else {
            $this->session->getFlashBag()->add('error_message', $this->translator->trans('email.message.resend_error'));
        }
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Send email
     *
     */
    public function sendEmail($id)
    {
        $email = $this->emailQueueRepo->find($id);
        $link = $this->projectSetting['base_url'].$this->container->get('router')->generate('office_brain_emailbundle_emailqueueadmin_reademail', array('id'=>$email->getId()));
        $html = $email->getContent()."<img src = ".$link." />";
        $isSent = $this->send($email->getTo(), $email->getFrom(), $email->getSubject(), $html, $email->getCc(), $email->getBcc(), explode(",", $email->getAttachment()), $email->getReplyTo(), '', $email->getFromName());
        if ($isSent) {
            if ($email->getFromAdm() != null && $email->getFromAdm() == 1) {
                $this->send($this->projectSetting['admin_email'], $email->getFrom(), $email->getSubject(), $html, $email->getCc(), $email->getBcc(), explode(",", $email->getAttachment()), $email->getReplyTo(), '', $email->getFromName());
            }
            $email->setIsSent('1');
            $this->commitDocument($email);
            $this->session->getFlashBag()->add('success_message', $this->translator->trans('email.message.send_success'));
        } else {
            $this->session->getFlashBag()->add('error_message', $this->translator->trans('email.message.send_error'));
        }
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Read email
     *
     */
    public function readEmail($id)
    {
        $this->email_queue_repo = $this->dm->getRepository('OfficeBrainEmailBundle:EmailQueue');
        $email = $this->email_queue_repo->find($id);
        $email->setIsRead('1');
        return $this->commitDocument($email);
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Preview email
     *
     */
    public function previewEmail($id)
    {
        $this->email_queue_repo = $this->dm->getRepository('OfficeBrainEmailBundle:EmailQueue');
        $email = $this->email_queue_repo->find($id);
        $email->setIsRead('1');
        $this->commitDocument($email);
        $data['html'] = htmlspecialchars_decode($email->getContent());
        return $data;
    }
}
