<?php

namespace Lc\ShopBundle\Services ;

use Doctrine\ORM\EntityManagerInterface;
use Lc\ShopBundle\Context\CreditHistoryInterface;
use Lc\ShopBundle\Context\MerchantInterface;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Lc\ShopBundle\Context\UserInterface;
use Lc\ShopBundle\Context\UserMerchantInterface;

class CreditUtils
{
        protected $em ;
        protected $merchantUtils ;
        protected $userMerchantRepository ;

        public function __construct(EntityManagerInterface $em, MerchantUtilsInterface $merchantUtils)
        {
                $this->em = $em ;
                $this->merchantUtils = $merchantUtils ;
                $this->userMerchantRepository = $this->em->getRepository($this->em->getClassMetadata(UserMerchantInterface::class)->getName()) ;
        }

        public function getUserMerchant(UserInterface $user, MerchantInterface $merchant = null)
        {
                $merchant = $this->getMerchant($merchant) ;
                $userMerchant = $this->userMerchantRepository->findOneBy([
                        'user' => $user,
                        'merchant' => $merchant
                ]) ;
                return $userMerchant ;
        }

        public function createUserMerchant(UserInterface $user, MerchantInterface $merchant = null)
        {
                $merchant = $this->getMerchant($merchant) ;
                $classUserMerchant = $this->em->getClassMetadata(UserMerchantInterface::class)->getName();

                $userMerchant = new $classUserMerchant ;
                $userMerchant->setUser($user) ;
                $userMerchant->setMerchant($merchant) ;
                $userMerchant->setCredit(0) ;
                $userMerchant->setCreditActive(true) ;

                $this->em->persist($userMerchant) ;
                $this->em->flush() ;

                return $userMerchant ;
        }

        public function updateCreditActive($user, $merchant = null, $creditActive = true)
        {
                $userMerchant = $this->getUserMerchant($user, $merchant) ;
                if(!$userMerchant) {
                        $userMerchant = $this->createUserMerchant($user, $merchant) ;
                }

                $userMerchant->setCreditActive($creditActive) ;

                $this->em->persist($userMerchant) ;
                $this->em->flush() ;

                return $userMerchant ;
        }

        public function activeCredit($user, $merchant = null)
        {
                return $this->updateCreditActive($user, $merchant, true) ;
        }

        public function unactiveCredit($user, $merchant = null)
        {
                return $this->updateCreditActive($user, $merchant, false) ;
        }

        public function createCreditHistory($user, $amount, $meanPayment, $comment = null, $merchant = null)
        {
                $userMerchant = $this->getUserMerchant($user, $merchant) ;

                if($userMerchant && $userMerchant->isCreditActive()) {
                        $classCreditHistory = $this->em->getClassMetadata(CreditHistoryInterface::class)->getName();

                        $creditHistory = new $classCreditHistory ;
                }

                return $creditHistory ;
        }

        public function addCredit($user, $amount, $merchant = null)
        {
                $merchant = $this->getMerchant($merchant) ;
        }
        
        public function removeCredit($user, $amount, $merchant = null)
        {
                $merchant = $this->getMerchant($merchant) ;
        }

        public function setCredit($user, $amount, $merchant = null)
        {

        }

        public function getMerchant($merchant)
        {
                if(!$merchant) {
                        $merchant = $this->merchantUtils->getMerchantCurrent() ;
                }

                return $merchant ;
        }
}