<?php

namespace OfficeBrain\Bundle\BannerBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 *
 * @author OfficeBrain 4571 <info@officebrain.com>
 *
 * Decsription: Banner Repository class to perform DB operation
 *
 */
/**
 * BannerRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class BannerRepository extends EntityRepository
{
    protected $projectSetting;
    protected $instanceId;
    protected $instanceType;
    protected $cultureId;
    protected $cultureCode;
    protected $paginatorservice;
    
	/**
	 * @author Employee Id: 5058
	 * OB eCommerce Product - getPaginatorService
	 * Function created to get Paginator Service
	 */
	public function getPaginatorService()
	{
		return $this->paginatorservice;
	}
	
	/**
	 * @author Employee Id: 5058
	 * OB eCommerce Product - setPaginatorService
	 * Function created to set Paginator Service
	 */
	public function setPaginatorService($paginatorService)
	{
		$this->paginatorservice = $paginatorService;
	}
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Set page
     *
     * @param : null
     *
     * @return null
     *
     * @throws : null
     *
     **/
    public function setProjectSetting($projetSetting)
    {
    	$this->projectSetting = $projetSetting;
    	$this->prepareProjectSettingData();
    }
    /**
     * @author Employee Id: 4571
     *
     * Description : get proj setting
     *
     * @param : null
     *
     * @return project setting array
     *
     * @throws : null
     *
     **/
    public function getProjectSetting()
    {
        return $this->projetSetting;
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Prepare Project Setting
     *
     * @param : null
     *
     * @return null
     *
     * @throws : null
     *
     **/
    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'];
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Persist Object
     *
     * @param : null
     *
     * @return Object
     *
     * @throws : null
     *
     **/
    public function set($banner)
    {
        $this->_em->persist($banner);
        return $banner;
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Commit entity
     *
     * @param : null
     *
     * @return last inserted id
     *
     * @throws : null
     *
     **/
    private function commit($entity)
    {
        $this->_em->persist($entity);
        $this->_em->flush();
        return $entity->getId();
    }
    
    
    /**
     * @author Employee Id: 4571
     *
     * Description : get Banner List
     *
     * @param 1: int $countryId,
     * @param 2 :int $languageId
     * @param 3: string search keyword
     * @param 4: date $startDate
     * @param 5: date $endDate
     *
     * @return result
     *
     * @throws : null
     *
     **/
     public function minsortposition()
     {
        $minposition= $this->createQueryBuilder('banner')->select('min(banner.sortPosition)')->getQuery()->getSingleScalarResult();
        $minposition=(int)$minposition-1;
        return $minposition;
    }
    public function getBannerList($countryId, $languageId =null, $search=null, $startDate=null, $endDate=null, $page, $recordPerPage)
    {
    	$count = $this->createQueryBuilder('banner')->select('COUNT(banner)')->getQuery()->getSingleScalarResult();
    	 
        $query = $this->createQueryBuilder('sg');
        $query->select(['sg', 'sgl']);
        $query->leftJoin('sg.bannerLanguage', 'sgl');
        
        $query->where('sg.instanceId = :instanceId')
              ->andwhere('sg.instanceType = :instanceType')
              ->addOrderBy('sg.sortPosition', 'ASC')
              ->setParameter('instanceId', $this->instanceId)
              ->setParameter('instanceType', $this->instanceType);
        
        if ($countryId) {
            $query->andwhere('sg.countryId = :countryId');
            $query->setParameter('countryId', $countryId);
        }
        
        if ($languageId) {
            $query->andwhere('sgl.languageId = :languageId');
            $query->setParameter('languageId', $languageId);
        }
        
        if ($startDate!="" && $startDate > 0) {
            $query->andwhere('sg.scheduleStartDate >= :startDate')
            ->setParameter('startDate', $startDate);
        }
        
        if ($endDate!="" && $endDate > 0) {
            $query->andwhere('sg.scheduleEndDate <= :endDate')
               ->setParameter('endDate', $endDate);
        }
        
        if ($search) {
            $query->andwhere('sg.bannerName LIKE :searchByName');
            $query->setParameter('searchByName', '%'.$search.'%');
        }

        $query->andWhere('sg.deletedAt IS NULL');
        //$result = $query->getQuery()->getSQL();print_r($result);die;
        $query->getQuery()->setHint('knp_paginator.count', $count);
		$result = $this->paginatorservice->paginate($query, $page, $recordPerPage);
        
        return $result;
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Search by banner name in tbl_banner
     *
     * @param : string $searchWord
     *
     * @return result
     *
     * @throws : null
     **/
    public function searchByName($searchWord)
    {
        $query = $this->createQueryBuilder('sg');
        $query->select(['sg', 'sgl']);
        
        $query->leftJoin('sg.bannerLanguage', 'sgl');
        if ($searchWord) {
            $query->where('sg.bannerName = :bannerName');
            $query->setParameter('bannerName', "%{$searchWord}%");
        }
        
        $query->andWhere('sg.deletedAt IS NULL');
        $result = $query->getQuery()->getArrayResult();
        
        return $result;
    }
    
    
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Delete Banner
     *
     * @param : banner id and deleted by id
     *
     * @return banner object
     *
     **/
    public function deleteBanners($id, $deleteUid)
    {
        $banner = $this->findOneBy(array('id' => $id));
        $banner->setDeletedAt(new \DateTime());
        $banner->setDeletedUid($deleteUid);
        $this->commit($banner);
        return $banner;
    }
    
    /**
     * To add.
     *
     * @param object $bannerFormObj
     *
     * @return Object
     */
    public function addBannerGroup($bannerGroup, $loggedInUserId = null, $id = null)
    {
        if (!$id) {
            $bannerGroup->setCreatedAt(new \DateTime());
        }
        
        if ($loggedInUserId) {
            $serviceGroup->setCreatedUid($loggedInUserId);
        }
                
        $bannerGroup = $this->set($bannerGroup);
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Find Banner Details
     *
     * @param : $bannerId
     *
     * @return record set
     *
     **/
    public function findBannerDetails($bannerId)
    {
        $query = $this->createQueryBuilder('sg');
        $query->select(['sg', 'sgl']);
        $query->leftJoin('sg.bannerLanguage', 'sgl');
        
        if ($bannerId) {
            $query->where('sg.id = :bannerId');
            $query->setParameter('bannerId', $bannerId);
        }
                    
        $query->andWhere('sg.deletedAt IS NULL');
        $result = $query->getQuery()->getArrayResult();
        
        return $result;
    }
    
    /**
     * @author Employee Id: 4571
     *
     * Description : Find Banner Details
     *
     * @param : $bannerId
     *
     * @return record set
     *
     **/
    public function findbannerDetailFromId($bannerId)
    {
        return $this->createQueryBuilder('a')
        ->Where('a.id = :bannerId')
        ->setParameter('bannerId', $bannerId)
        ->orderBy('a.id', 'DESC')
        ->getQuery()->getOneOrNullResult();//die;
    }
    
    /**
     * @author Employee Id: 4505
     *
     * Description : Get current banner attributes style
     *
     * @param 1 : int banner id
     * @param 2 : int type id
     *
     * @return record set
     *
     * @throws : null
     *
     **/
    public function findStyleOfBanner($bannerId)
    {
        $fields = array('bm.id', 'bm.bannerHtml', 'bm.uploadedBanner','IDENTITY(bm.bannerTypeId) as bannerTypeId');
        return $this->createQueryBuilder('bm')
                        ->select($fields)
                        ->where('bm.id = :id')
                        ->setParameter(':id', $bannerId)
                        ->getQuery()
                        ->getSingleResult();
    }
    
    /**
     * @author Employee Id: 4464
     *
     * Description : Find Banner Details by baner type id
     *
     * @param : $bannerTypeId
     *
     * @return record set
     *
     **/
    public function findByBannerTyperId($bannerTypeId)
    {
        return $this->createQueryBuilder('b')
            ->select('b')
            ->where('b.bannerTypeId = :bannerTypeId')
            ->setParameter('bannerTypeId', $bannerTypeId)
            ->andWhere('b.deletedAt IS NULL')
            ->getQuery()
            ->getResult();
    }
    

    public function changeStatus($id)
    {
    	$bannerMaster = $this->findOneBy(array('id' => $id));
    	if ($bannerMaster) {
    		$em = $this->getEntityManager();
    		if ($bannerMaster->getStatus() == 1) {
    			$bannerMaster->setStatus(0);
    		} else {
    			$bannerMaster->setStatus(1);
    		}
    		$em->persist($bannerMaster);
    		$em->flush();
    		return true;
    	}
    
    	return false;
    }
}
