<?php

namespace OfficeBrain\Bundle\RewardReferralBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 * ReffralMasterRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class ReferralMasterRepository extends EntityRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;
    protected $paginatorService;
    protected $projectSettingService;

    public function getPaginatorService()
    {
        return $this->paginatorService;
    }

    public function setPaginatorService($paginatorService)
    {
        $this->paginatorService = $paginatorService;
    }

    public function getProjectSetting()
    {
        return $this->paginatorService;
    }

    public function setProjectSetting($projectSetting)
    {
        $this->projectSetting = $projectSetting;
        $this->prepareProjectSettingData();
    }

    public function prepareProjectSettingData()
    {
        $this->userId = $this->projectSetting['user_id'];
        $this->createdUid = $this->upatedUid = $this->userId;
        $this->instanceId = $this->projectSetting['instance_id'];
        $this->instanceType = $this->projectSetting['instance_type'];
        $this->cultureId = $this->projectSetting['culture_id'];
        $this->cultureCode = $this->projectSetting['culture_code'];
    }
    
    /**
     * @Author Employee Id: 4589
     * Description : Function created for define a common querybuilder object
     *
     * @return object
     */
    public function getQueryBuilder()
    {
        return $this->getEntityManager()->getRepository('OfficeBrainRewardReferralBundle:ReferralMaster')->createQueryBuilder('rm');
    }
    
    /**
     * @Author Employee Id: 4589
     * Description : Function created for save referral master
     *
     * @return object
     */
    public function setReferralMaster($referralMaster)
    {
        $em = $this->getEntityManager();
        
        $referralMaster->setSenderId($this->userId);
        
        $referralMaster->setInstanceId($this->instanceId);
        $referralMaster->setInstanceType($this->instanceType);
        $referralMaster->setCreatedUid($this->userId);
        $referralMaster->setCreatedAt(new \DateTime());
        $referralMaster->setUpdatedUid($this->userId);
        $referralMaster->setUpdatedAt(new \DateTime());
        
        $em->persist($referralMaster);
    }
    
    /**
     * @Author Employee Id: 4589
     * Description : Function created for get single object
     *
     * @return object
     */
    public function findBySenderId($senderId)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select(['rm', 'rr']);
        $queryBuilder->leftJoin('rm.referralRecipient', 'rr');
        $queryBuilder->where('rm.senderId = :senderId');
        $queryBuilder->setParameter('senderId', $senderId);
        $result = $queryBuilder->getQuery()->getResult();
        
        
        if ($result) {
            return $result[0];
        }
        
        return $result;
    }
    
    /**
     * @Author Employee Id: 4589
     * Description : Function created for get single object
     *
     * @return object
     */
    public function findByEmail($email)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select(['rm', 'rr']);
        $queryBuilder->leftJoin('rm.referralRecipient', 'rr');
        $queryBuilder->where('rr.email = :email');
        $queryBuilder->andWhere('rr.isRegistered = 1');
        $queryBuilder->setParameter('email', $email);
        
        $result = $queryBuilder->getQuery()->getResult();
        
        if ($result) {
            return $result[0];
        }
        
        return $result;
    }
    
    /**
     * @Author Employee Id: 4589
     * Description : Function created for get single object by senderid and recipient email
     *
     * @return object
     */
    public function findBySenderIdAndRecipientEmail($senderId, $email)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select(['rm', 'rr']);
        $queryBuilder->leftJoin('rm.referralRecipient', 'rr');
        $queryBuilder->where('rm.senderId = :senderId');
        $queryBuilder->andWhere('rr.email = :email');
        $queryBuilder->setParameter('senderId', $senderId);
        $queryBuilder->setParameter('email', $email);
        
        $result = $queryBuilder->getQuery()->getResult();
        
        if ($result) {
            return $result[0];
        }
        
        return $result;
    }
   
    /**
     * @Author Employee Id: 4589
     * Description : Function created for check user already sent request to same email
     *
     * @return object
     */
    public function isEmailRequestExists($senderId, $email)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('count(rm.id)');
        $queryBuilder->leftJoin('rm.referralRecipient', 'rr');
        $queryBuilder->where('rm.senderId = :senderId');
        $queryBuilder->andWhere('rr.email = :emailAddress');
        
        $queryBuilder->setParameter('senderId', $senderId)
                ->setParameter('emailAddress', $email);

        $isEmailRequestExists = $queryBuilder->getQuery()->getSingleScalarResult();

        if ($isEmailRequestExists && $isEmailRequestExists > 0) {
            return true;
        } else {
            return false;
        }
    }
    
    public function commit()
    {
        $em = $this->getEntityManager();
        $em->flush();
    }

    public function clear()
    {
        $em = $this->getEntityManager();
        $em->clear();
    }
}
