<?php

namespace OfficeBrain\CustomBundle\ServiceGroupBundle\Manager\Extended;

use OfficeBrain\CustomBundle\ServiceGroupBundle\Manager\AbstractManager\CouponUsersAbstract as CouponUsersAbstract;
use OfficeBrain\CustomBundle\ServiceGroupBundle\Entity\CouponUsers;

class CouponUsersExtended extends CouponUsersAbstract
{
    public function __construct($entityManager, $request, $paginatorManager, $countries, $languages, $userManager, $emailService)
    {
        parent::__construct($entityManager, $request, $paginatorManager, $countries, $languages, $userManager, $emailService);
    }

    public function __destruct()
    {
        parent::__destruct();
    }

    /**
     * @author Employee Id: 5497
     * Description : get all coupon users
     *
     * @return object
     * */
    public function getCouponUsersList()
    {
        $data = array();

        $couponUsers = $this->couponUsersRepository->getCouponUsersByCouponId($this->request->get('id'));
        if (count($couponUsers) > 0) {
            $data['pagination'] = $this->paginatorManager->paginate($couponUsers, $this->request->get('page'), $this->recordsPerPage, array(), count($couponUsers));
        }

        $data['records_per_page'] = $this->recordsPerPage;
        $data['page'] = $this->request->get('page');

        return $data;
    }

    public function getCouponUsersByCouponName()
    {
        $data = array();

        $couponUsers = $this->couponUsersRepository->findByCouponName($this->request->get('coupon_name'));
        
        if (empty($couponUsers)) {
            $data['error'] = "PAGE_NOT_FOUND";
        } 
        else {
            $data = $couponUsers[0];
            
            if ($this->projectSetting['user_id'] == $data['createdUid']) {
            	$data['inline_edit'] = false; //Set false temporarily to turn of inline editing as this functionality yet to be done.
            }
        }
        
        return $data;
    }
    

    /**
     * @author Employee Id: 5497
     * Description : Save coupon data to database
     *
     * @return object
     * */
    public function setCouponUsers()
    {
    	$deleteUserIds = array();
    	$existUserIds = array();
    	$usedRedeemUserIds = array();
    	
    	$coupon = $this->promoCouponRepository->getPromoCouponById($this->request->get('id'));
    	
    	$deleteUserIds = $this->deleteUnselectedUsers($coupon->getId());
    	$existUserIds = $this->getSelectedUserList();
    	$usedRedeemUserIds = $this->getUsedRedeemUserList();
    	
    	foreach($this->request->get('user_mapp') as $userId) {
    		if(!in_array($userId,$usedRedeemUserIds))
    		{
	    		$user = $this->userManager->getUserById($userId);
	    		$couponUsers = new CouponUsers();
	    		$couponUsers->setPromoCouponId($coupon);
	    		$couponUsers->setUserId($user);
	
	    		$this->couponUsersRepository->set($couponUsers);
	    		
	    		if(!in_array($userId,$existUserIds))
	    		{
	    			$this->sendCouponCodeToUser($user,$coupon->getCouponName());
	    		}
    		}
    	}
		
    	unset($deleteUserIds);
    	unset($existUserIds);
    	unset($usedRedeemUserIds);
    	
        return $couponUsers;
    }
	
    /**
     * @author Employee Id: 5497
     * Description : Send CouponCode mail to User
     */
    public function sendCouponCodeToUser($user, $couponcode)
    {
    	$eventKey = 'coupon_code_email'; // This is required field. For each email we have to set event with unique event key.
    	$to = $user->getEmail(); // This is required field.
    	$params = array( 
    			'user_name' => $user->getFirstName()." ".$user->getLastName(),
    			'coupon_code' => $couponcode
    	);
    	$languageId = $this->projectSetting['culture_id'];//This is optional field but when you call this function from admin section you have to pass languageId.
    	$from =  $this->projectSetting['admin_email']; //This is optional field.
    
    	$this->emailService->sendMail($eventKey, $to, $params, $languageId, $from);
    
    	return true;
    }

    /**
     * @author Employee Id: 5497
     * Description : Find coupon name of object
     *
     * @return object
     * */
    public function getCouponUsersById($id = 0)
    {
    	if ($id == 0) {
    		$id = $this->request->get('id');
    	}

        return $this->couponUsersRepository->getCouponUsersById($id);
    }

    /**
     * @author Employee Id: 5497
     * Description : Soft delete of coupon name
     *
     * @return object
     * */
    public function deleteCouponUsers()
    {
        $pageObj = $this->couponUsersRepository->getCouponUsersById($this->request->get('id'));

        if (is_object($pageObj)) {
            $pageObj->setDeletedAt(new \DateTime());
            $pageObj->setDeletedUid($this->projectSetting['user_id']);

            return $this->couponUsersRepository->set($pageObj);
        }
    }
    
    /**
     * @author Employee Id: 5497
     * Description : Save coupon data to database
     *
     * @return object
     * */
    public function getSelectedUserList()
    {
    	$data = array();
    	$couponId = $this->request->get('id');
    	
    	$selectedUsers = $this->couponUsersRepository->getCouponUsersByCouponId($couponId);
    	
    	foreach ($selectedUsers as $key => $val) {
    		$data[] = $val->getUserId()->getId();
    	}
    	
    	return $data;
    }
    

    /**
     * @author Employee Id: 5497
     * Description : get applied users
     *
     * @return object
     * */
    public function getUsedUserList()
    {
    	$data = array();
    	$couponId = $this->request->get('id');
    	 
    	$selectedUsers = $this->couponUsersRepository->getUsedCouponUsersByCouponId($couponId);
    	 
    	foreach ($selectedUsers as $key => $val) {
    		$data[] = $val->getUserId()->getId();
    	}
    	 
    	return $data;
    }
    

    /**
     * @author Employee Id: 5497
     * Description : get applied users
     *
     * @return object
     * */
    public function getUsedRedeemUserList()
    {
    	$data = array();
    	$couponId = $this->request->get('id');
    	 
    	$selectedUsers = $this->couponUsersRepository->getUsedRedeemCouponUsersByCouponId($couponId);
    	 
    	foreach ($selectedUsers as $key => $val) {
    		$data[] = $val->getUserId()->getId();
    	}
    	 
    	return $data;
    }
    
    /**
     * @author Employee Id: 5497
     * Description : Soft delete of coupon name
     *
     * @return object
     * */
    public function deleteUnselectedUsers($couponId)
    {
    	$existUserIds = array();
    	$allCouponUsers = $this->couponUsersRepository->getActiveCouponUsersByCouponId($this->request->get('id'));
    	
    	foreach($allCouponUsers as $couponUser) {
    		$existUserIds[] = $couponUser->getUserId()->getId();
    		$this->couponUsersRepository->remove($couponUser);
    	}
    	
    	return $existUserIds;
    }
	
	public function setCouponCodeToUser($coupon) 
    {
	    $this->couponUsersRepository->setCouponCodeToUser($coupon,$this->userManager);
    }
    
    public function isCouponRedeem($couponId) 
    {
    	$couponUser = $this->couponUsersRepository->findByCouponIdAndUserId($couponId);
    	
    	if (count($couponUser) > 0 && $couponUser->getIsRedeem() == 0) {
    		$couponUser->setIsRedeem(1);
    		$this->couponUsersRepository->set($couponUser);
    	}
    }
    
    public function findActiveUserRedeemCoupon()
    {
    	$couponUser = $this->couponUsersRepository->findActiveUserRedeemCoupon();
    	return $couponUser;
    }
    
    public function getUserCouponRedeemStatus($couponId)
    {
    	$couponUser = $this->couponUsersRepository->getUserCouponRedeemStatus($couponId);
    	return $couponUser;
    }
    
    public function removeRedeemCoupon($couponId)
    {
    	$couponUser = $this->couponUsersRepository->findByCouponIdAndUserId($couponId);
    
    	if (count($couponUser) > 0 && $couponUser->getIsRedeem() == 1) {
    		//$couponUser->setIsRedeem(0);
    		//$this->couponUsersRepository->set($couponUser);
    		$this->couponUsersRepository->remove($couponUser);
    	}
    }
    
    /**
     * @author Employee Id: 5497
     * Description : Save coupon data to database
     *
     * @return object
     * */
    public function setIsUsedCoupon($couponId)
    {
    	$couponUser = $this->couponUsersRepository->findByCouponIdAndUserId($couponId);
    	
    	if (count($couponUser) > 0 && $couponUser->getIsUsed() == 0) {
    		$couponUser->setIsUsed(1);
    		$this->couponUsersRepository->set($couponUser);
    	}
    }
}
