<?php
namespace OfficeBrain\Bundle\FeedBackBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * @author OfficeBrain 4464 <info@officebrain.com>
 *
 * Description : This is the repository class.
 *
 * FeedBackMasterRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class FeedBackMasterRepository extends EntityRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;
    protected $userId;
    protected $projectId;
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to set project settings
     *
     * @param 1: $projectSetting
     *
     * @return: NULL
     *
     * @throws Exception: Null
     */
    public function setProjectSetting($projetSetting)
    {
        $this->projectSetting = $projetSetting;
        $this->prepareProjectSettingData();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to get project settings
     *
     * @param : None
     *
     * @return: project setting array
     *
     * @throws Exception: Null
     */
    public function getProjectSetting()
    {
        return $this->projetSetting;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to set member variables default value
     *
     * @param : None
     *
     * @return: NULL
     *
     * @throws Exception: Null
     */
    public function prepareProjectSettingData()
    {
        $this->projectId = $this->projectSetting['project_id'];
        $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'];
        $this->userId = $this->projectSetting['user_id'];
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to perform add and edit records in the database.
     *
     * @param 1 : entity object
     *
     * @return Null
     *
     * @throws Exception: Null
     *
     **/
    public function commit($entity)
    {
        $this->_em->persist($entity);
        $this->_em->flush();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : Find single  based on ID
     *
     * @param $id
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     */
    public function find($id, $lockMode = NULL, $lockVersion = NULL)
    {
        return $this->createQueryBuilder('fm')
        ->select('fm')
        ->where('fm.id = :id')
        ->andWhere('fm.deletedAt IS NULL')
        ->setParameter(':id', $id)
        ->getQuery()
        ->getSingleResult();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : Find feedback based on order id
     *
     * @param 1: $orderId
     * @param 2: $productId
     * @param 3: $userId
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     */
    public function findByOrder($orderId, $productId = null, $userId = null)
    {
        $queryBuilder = $this->createQueryBuilder('fm')
            ->select('fm')
            ->where('fm.orderId = :orderId');
        
        if (!empty($productId)) {
            $queryBuilder = $queryBuilder->andWhere('fm.productId = :productId')
                ->setParameter(':productId', $productId);
        }
        
        if (!empty($userId)) {
            $queryBuilder = $queryBuilder->andWhere('fm.userId = :userId')
                ->setParameter(':userId', $userId);
        }
        
        $queryBuilder = $queryBuilder
            ->andWhere('fm.deletedAt IS NULL')
            ->setParameter(':orderId', $orderId);
        return $queryBuilder
            ->getQuery()
            ->getResult();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function will insert the feedback given by user into the database
     *
     * @param 1 : $formData
     * @param 2 : $orderId
     * @param 3 : $productId
     * @param 4 : $feedbackSettings
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     *
     **/
    public function setFeedBack($formData, $orderId, $productId, $isModerationOn)
    {
        $feedbackMaster = new FeedBackMaster();
        $feedbackMaster->setUserId($this->userId);
        $feedbackMaster->setOrderId($orderId);
        $feedbackMaster->setProductId($productId);
        $feedbackMaster->setRatings($formData->getRatings());
        $feedbackMaster->setComment($formData->getComment());
        if ($isModerationOn == 1) {
            $feedbackMaster->setIsApproved('0');
        } else {
            $feedbackMaster->setIsApproved('1');
        }

        $feedbackMaster->setSendApprovalMail('0');
        $feedbackMaster->setProjectId($this->projectId);
        $feedbackMaster->setInstanceId($this->instanceId);
        $feedbackMaster->setInstanceType($this->instanceType);
        $feedbackMaster->setLanguageId($this->cultureId);
        $feedbackMaster->setCreatedAt(new \DateTime());
        $feedbackMaster->setCreatedUid($this->userId);
        
        $this->commit($feedbackMaster);
        return $feedbackMaster;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function will fetch the feedbacks given by the user from the database
     *
     * @param 1 : $userId
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     *
     **/
    public function getFeedBackList($userId = null, $productId = array(), $searchUserId = array(), $createdDate = null)
    {
        $queryBuilder = $this->createQueryBuilder('fm');
        $queryBuilder = $queryBuilder
            ->select('fm');
        
        if (!empty($userId)) {
            $queryBuilder =  $queryBuilder
                ->where('fm.userId = :user_id')
                ->setParameter(':user_id', $userId);
        }
        
        if (!empty($productId)) {
            $queryBuilder =  $queryBuilder
            ->where('fm.productId IN (:product_id)')
            ->setParameter(':product_id', $productId);
        }
        
        if (!empty($searchUserId)) {
            $queryBuilder =  $queryBuilder
            ->andWhere('fm.userId  IN (:user_id)')
            ->setParameter(':user_id', $searchUserId);
        }
        
        /* if (!empty($createdDate)) {
            $queryBuilder =  $queryBuilder
            ->andWhere('fm.createdAt = :created_date')
            ->setParameter(':created_date', $createdDate);
        } */
        
        if (!empty($createdDate)) {
            $queryBuilder =  $queryBuilder
            ->andWhere('fm.createdAt BETWEEN :startedDatetime AND :endedDatetime')
            ->setParameter(':startedDatetime', date('Y-m-d H:i:s', strtotime($createdDate.' 00:00:00')))
            ->setParameter(':endedDatetime', date('Y-m-d H:i:s', strtotime($createdDate.' 23:59:59')));
        }
        
        $queryBuilder =  $queryBuilder
            ->andWhere('fm.deletedAt IS NULL')
            ->orderBy('fm.createdAt', 'DESC');
        
        return $queryBuilder
            ->getQuery()
            ->getResult();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to approve the feedback given by the user
     *
     * @param 1 : $feedBackId
     *
     * @return : True
     *
     * @throws Exception: Null
     *
     **/
    public function approveFeedBack($feedBackId)
    {
        $feedBack = $this->find($feedBackId);
        $feedBack->setIsApproved('1');
        $feedBack->setSendApprovalMail('1');
        $this->commit($feedBack);
        return true;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to reject the feedback given by the user
     *
     * @param 1 : $feedBackId
     *
     * @return : True
     *
     * @throws Exception: Null
     *
     **/
    public function rejectFeedBack($feedBackId)
    {
        $feedBack = $this->find($feedBackId);
        $feedBack->setIsApproved('2');
        $this->commit($feedBack);
        return true;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to (soft)delete the feedback given by the user
     *
     * @param 1 : $feedBackId
     *
     * @return : True
     *
     * @throws Exception: Null
     *
     **/
    public function deleteFeedBack($feedBackId)
    {
        $feedBack = $this->find($feedBackId);
        $feedBack->setDeletedAt(new \DateTime());
        $feedBack->setDeletedUid($this->userId);
        $this->commit($feedBack);
        return true;
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to show feedback details
     *
     * @param 1 : $feedBackId
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     *
     **/
    public function showFeedBack($feedBackId)
    {
        return $this->find($feedBackId);
    }

    /**
     * @author Employee Id: 4464
     *
     * Description : This function is used to show feedback details
     *
     * @param 1 : $feedBackId
     *
     * @return : Feedback Master Object
     *
     * @throws Exception: Null
     *
     **/
    public function isFeedBackGiven($orderId, $productId, $userId)
    {
        $queryBuilder = $this->createQueryBuilder('fm')
        ->select('fm')
        ->where('fm.orderId = :orderId');
        
        if (!empty($productId)) {
            $queryBuilder = $queryBuilder->andWhere('fm.productId = :productId')
            ->setParameter(':productId', $productId);
        }
        
        if (!empty($userId)) {
            $queryBuilder = $queryBuilder->andWhere('fm.userId = :userId')
            ->setParameter(':userId', $userId);
        }
        
        $queryBuilder = $queryBuilder->andWhere('fm.deletedAt IS NULL')->setParameter(':orderId', $orderId);
        
        //return $queryBuilder->getQuery()->getSingleScalarResult();
        return $queryBuilder->getQuery()->getOneOrNullResult();
    }
}
