<?php

namespace OfficeBrain\Bundle\EmailBundle\Document;

use Doctrine\ODM\MongoDB\DocumentRepository;
use OfficeBrain\Bundle\QueueBundle\Document\DistributorQueue;

/**
 *
 * @author OfficeBrain 4795
 *
 */
/**
 * EmailQueueRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class EmailQueueRepository extends DocumentRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;
    
    public function setProjectSetting($projetSetting)
    {
        $this->projectSetting = $projetSetting;
        $this->prepareProjectSettingData();
    }
    
    public function getProjectSetting()
    {
        return $this->projetSetting;
    }
    
    public function prepareProjectSettingData()
    {
        $this->instanceId   = $this->projectSetting['instance_id'];
        $this->instanceType = $this->projectSetting['instance_type'];
        $this->userId       = $this->projectSetting['user_id'];
        $this->cultureId    = $this->projectSetting['culture_id'];
        $this->cultureCode  = $this->projectSetting['culture_code'];
    }
    
    public function getQueryBuilder()
    {
        return $this->getDocumentManager()->getRepository('OfficeBrainEmailBundle:EmailQueue')->createQueryBuilder('e');
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Find all emails
     *
     */
    public function findAll()
    {
        $queryBuilder = $this->getQueryBuilder();
        $emails = $queryBuilder->field('instanceType')->equals($this->instanceType)
                               ->field('instanceId')->equals(intval($this->instanceId))
                               
                               ->sort('id', 'DESC')
                               ->getQuery()
                               ->execute()->toArray();
        
        return $emails;
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Find single email based on ID
     *
     * @param $id
     */
    public function find($id, $lockMode = NULL, $lockVersion = NULL)
    {
        $queryBuilder = $this->getQueryBuilder();
        $emails = $queryBuilder->field('id')->equals($id)
                               ->field('instanceId')->equals(intval($this->instanceId))
                               ->field('instanceType')->equals($this->instanceType)
                               ->getQuery()
                               ->getSingleResult();         
        return $emails;
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Find unsend emails
     *
     */
    public function findUnsendEmails()
    {
        
        $queryBuilder = $this->getQueryBuilder();
        $emails = $queryBuilder->field('isSent')->equals(null)
                               ->field('instanceId')->equals(intval($this->instanceId))
                               ->field('instanceType')->equals($this->instanceType)
                               ->sort('priority', 'ASC')
                               ->limit(100)
                               ->getQuery()
                               ->execute();
        
        return $emails;
    }
    
    /**
     * @author Employee Id: 4795
     *
     * Description : Search emails based on searched parameters
     *
     * @param $dataArr
     */
    public function searchEmails($dataArr)
    {
        $queryBuilder = $this->getQueryBuilder();
        $emails = $queryBuilder->field('instanceId')->equals(intval($this->instanceId))
        ->field('instanceType')->equals($this->instanceType);
        $likekeyword = new \MongoRegex('/.*'.$dataArr['keyword'].'.*/i');
        switch ($dataArr['option']) {
            case 'id' :
                $emails->addAnd($emails->expr()->field('id')->equals(new \MongoRegex('/.*'.intval($dataArr['keyword']).'.*/i')));
            break;
            case 'to' :
                $emails->addAnd($emails->expr()->field('to')->equals($likekeyword));
            break;
            case 'from' :
                $emails->addAnd($emails->expr()->field('from')->equals($likekeyword));
            break;
            case 'subject' :
                $emails->addAnd($emails->expr()->field('subject')->equals($likekeyword));
                break;
            case 'sendAt' :
            	$from = new \MongoDate(strtotime(date('Y-m-d H:i:s', strtotime($dataArr['sendAt'].' 00:00:00'))));
            	$to = new \MongoDate(strtotime(date('Y-m-d H:i:s', strtotime($dataArr['sendAt'].' 23:59:59'))));
                $emails->addAnd($emails->expr()->field('sendAt')->range($from, $to));
            break;
            
        }
                 
        $emails->sort('id', 'DESC')
        ->getQuery()
        ->execute()->toArray();
         
        return $emails;
    }
}
