<?php

namespace OfficeBrain\Bundle\WishListBundle\Entity;

use Doctrine\ORM\EntityRepository;

/**
 *
 * @author Employee Id: 4248
 * OB eCommerce Product - WishList
 * WishListRepository
 * This class was generated by the Doctrine ORM. Add your own custom
 * - List All the WishList Product
 * - Add New Product to Wishlist
 *
 */

class WishListRepository 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: 4248
     * OB eCommerce Product - Wishlist
    * Function created for define a common querybuilder object
     * @param integer $userId
     * @return number
     */
    public function getQueryBuilder()
    {
        return $this->getEntityManager()->getRepository('OfficeBrainWishListBundle:WishList')->createQueryBuilder('wl');
    }
     
    /**
     * @author Employee Id: 4248
     * OB eCommerce Product - Wishlist
     * In Progress
     * Function created for Getting all the product which is added into the wishlist
     * @param integer $userId
     * @return number
     */
    public function getWishListPage($page, $recordPerPage,$currentCulCode)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('wl.id', 'wl.productId', 'wl.cultureProductId', 'wl.cultureId', 'wl.userId', 'wl.productCountryDetail');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail')
                     ->setParameter('userId', $this->userId)
                     ->setParameter('cultureId', $this->cultureId)
                     ->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
                     ->setParameter('instanceId', $this->instanceId);

        $query = $queryBuilder->getQuery();//->useResultCache(true)->setResultCacheLifetime(120)->setResultCacheId('evans-active_banner_list');

        return $this->paginatorService->paginate($query, $page, $recordPerPage);
    }

    public function getWishList()
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('wl.id', 'wl.productId', 'wl.cultureProductId', 'wl.cultureId', 'IDENTITY(wl.userId) as userId');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId')
                     ->setParameter('userId', $this->userId)
                     ->setParameter('cultureId', $this->cultureId)
                     ->setParameter('instanceId', $this->instanceId);
        
        return $queryBuilder->getQuery()->getResult();
    }

    public function addWishList($productId, $cultureProductId,$productCountryDetail)
    {
        $wishList = new WishList();
        $wishList->setProductId($productId);
        $wishList->setCultureProductId($cultureProductId);
        $wishList->setCultureId($this->cultureId);
        $wishList->setUserId($this->userId);
        $wishList->setCreatedUid($this->createdUid);
        $wishList->setUpatedUid($this->upatedUid);
        $wishList->setInstanceId($this->instanceId);
        $wishList->setInstanceType($this->instanceType);
        $wishList->setProductCountryDetail($productCountryDetail);
        $em = $this->getEntityManager();
        $em->persist($wishList);
        $em->flush();
        
        return $wishList;
    }

    public function isWishListExists($productId, $cultureProductId,$currentCulCode)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('count(wl.id)');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.productId = :productId AND wl.cultureProductId = :cultureProductId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail');
        $queryBuilder->setParameter('userId', $this->userId)
            ->setParameter('productId', $productId)
            ->setParameter('cultureProductId', $cultureProductId)
            ->setParameter('cultureId', $this->cultureId)
            ->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
            ->setParameter('instanceId', $this->instanceId);
        
        $isWishListExists = $queryBuilder->getQuery()->getSingleScalarResult();

        if ($isWishListExists) {
            return true;
        } else {
            return null;
        }
    }

    public function getTotalCountUserWise($currentCulCode)
    {
        /* $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('count(wl.id)');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId')
            ->setParameter('userId', $this->userId)
            ->setParameter('cultureId', $this->cultureId)
            ->setParameter('instanceId', $this->instanceId);

        $count = $queryBuilder->getQuery()->getSingleScalarResult();
        if ($count) {
            return $count;
        } else {
            return 'null';
        } */
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('count(wl.id)');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail')
        ->setParameter('userId', $this->userId)
        ->setParameter('cultureId', $this->cultureId)
        ->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
        ->setParameter('instanceId', $this->instanceId);
        return $queryBuilder->getQuery()->getSingleScalarResult();
    }

    public function findAllProduct($currentCulCode)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('wl.id', 'wl.productId', 'wl.cultureProductId', 'wl.cultureId', 'wl.userId as userId');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail')
            ->setParameter('userId', $this->userId)
            ->setParameter('cultureId', $this->cultureId)
            ->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
            ->setParameter('instanceId', $this->instanceId);

        return $queryBuilder->getQuery()->getResult();
    }

    public function getMaxNoOfProduct($maxNo,$currentCulCode)
    {
    	$queryBuilder = $this->getQueryBuilder();
        $queryBuilder->select('wl.id', 'wl.productId', 'wl.cultureProductId', 'wl.cultureId', 'wl.userId as userId');
        $queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail')
            		 ->setParameter('userId', $this->userId)
            		 ->setParameter('cultureId', $this->cultureId)
            		 ->setParameter('instanceId', $this->instanceId)
            		 ->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
            		 ->addOrderBy('wl.id', 'DESC')
            	     ->setMaxResults($maxNo);

        return $queryBuilder->getQuery()->getResult();
    }

    public function deleteWishList($productId, $cultureProductId)
    {
        $queryBuilder = $this->getQueryBuilder();
        $queryBuilder->delete('OfficeBrainWishListBundle:WishList', 'wl');
//         $queryBuilder->where('wl.productId = :productId AND wl.cultureProductId = :cultureProductId AND wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId')
//             		 ->setParameter('productId', $productId)
//             		 ->setParameter('cultureProductId', $cultureProductId)
//             		 ->setParameter('userId', $this->userId)
//             		 ->setParameter('cultureId', $this->cultureId)
//             		 ->setParameter('instanceId', $this->instanceId);

        $queryBuilder->where('wl.productId = :productId AND wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId')
	        ->setParameter('productId', $productId)
	        ->setParameter('userId', $this->userId)
	        ->setParameter('cultureId', $this->cultureId)
	        ->setParameter('instanceId', $this->instanceId);

        return $queryBuilder->getQuery()->execute();
    }
    
    public function deleteAllWishList($currentCulCode)
    {
    	$queryBuilder = $this->getQueryBuilder();
    	$queryBuilder->delete('OfficeBrainWishListBundle:WishList', 'wl');
    	$queryBuilder->where('wl.userId = :userId AND wl.cultureId = :cultureId AND wl.instanceId = :instanceId AND wl.productCountryDetail LIKE :productCountryDetail')
    	->setParameter('userId', $this->userId)
    	->setParameter('cultureId', $this->cultureId)
    	->setParameter('productCountryDetail', '%'.$currentCulCode.'%')
    	->setParameter('instanceId', $this->instanceId);
    
    	return $queryBuilder->getQuery()->execute();
    }
}
