<?php
/**
* @author OfficeBrain 4160 <info@officebrain.com>
*
* Description :  Product Queue DocumentRepository
*
**/
namespace OfficeBrain\Bundle\QueueBundle\Document;

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

/**
 * ProductQueueRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ProductQueueRepository extends DocumentRepository
{
    public function getQueryBudler()
    {
        return $this->getDocumentManager()->getRepository('OfficeBrainQueueBundle:ProductQueue')->createQueryBuilder('p');
    }
    
    public function save($queueObj)
    {
        $dm = $this->getDocumentManager();
        $dm->persist($queueObj);
        $dm->flush();
        return $queueObj;
    }
    
    public function deleteQueue($queueObj)
    {
        $queryBuilder = $this->getQueryBudler();
        $queryBuilder->remove()->field('id')->equals($queueObj->getId())->getQuery()->execute();
        return true;
    }
    
    public function saveHistory($queueObj)
    {
        $this->save($queueObj);
    }
    
    public function findNewJobs($instance_id, $count)
    {
        //return $this->getDocumentManager()->getRepository('OfficeBrainQueueBundle:ProductQueue')->find('555d9e8f8af881331a6dff39');    //555f2bc58af88110108b4567
        
        $queryBuilder = $this->getQueryBudler();
        $cursorResult = $queryBuilder->field('instanceId')->equals($instance_id)
                                    ->field('status')->equals('New')
                                    ->field('from')->equals('2')
                                    ->sort('id', 'ASC')
                                    ->limit($count)
                                    ->getQuery()
                                    ->execute();
        return $cursorResult;
    }
    
    public function findInProgressJobs($instance_id)
    {
        $queryBuilder = $this->getQueryBudler();
        $cursorResult = $queryBuilder->addAnd($queryBuilder->expr()->field('instanceId')->equals($instance_id))
                                    ->addAnd($queryBuilder->expr()->field('from')->in(array('2', '3')))
                                    ->addAnd($queryBuilder->expr()->addOr($queryBuilder->expr()->field('status')->equals('In Progress'))->addOr($queryBuilder->expr()->field('webStatus')->equals('In Progress')))
                                    ->sort('id', 'ASC')
                                    ->getQuery()
                                    ->execute();
        return $cursorResult;
    }
    
    public function findErrorJobs($instance_id, $count)
    {
        $queryBuilder = $this->getQueryBudler();
        $cursorResult = $queryBuilder->addAnd($queryBuilder->expr()->field('instanceId')->equals($instance_id))
                                    ->addAnd($queryBuilder->expr()->field('from')->in(array('2', '3')))
                                    ->addAnd($queryBuilder->expr()->addOr($queryBuilder->expr()->field('status')->equals('Error'))->addOr($queryBuilder->expr()->field('webStatus')->equals('Error')))
                                    ->sort('id', 'ASC')
                                    ->getQuery()
                                    ->execute();
        return $cursorResult;
    }
    
    public function findRunJobs($instance_id, $count)
    {
        $queryBuilder = $this->getQueryBudler();
        $cursorResult = $queryBuilder->addAnd($queryBuilder->expr()->field('instanceId')->equals($instance_id))
                                    ->addAnd($queryBuilder->expr()->field('from')->in(array('2', '3')))
                                    ->addAnd($queryBuilder->expr()->field('status')->notEqual('In Progress'))
                                    ->addAnd($queryBuilder->expr()->field('webStatus')->notEqual('In Progress'))
                                    ->addAnd($queryBuilder->expr()->addOr($queryBuilder->expr()->field('status')->in(array('New', 'Error')))->addOr($queryBuilder->expr()->field('webStatus')->in(array('New', 'Error'))))
                                    ->sort('id', 'ASC')
                                    ->getQuery()
                                    ->execute();
        return $cursorResult;
    }
}
