<?php

namespace Lc\ShopBundle\Controller\Frontend ;

use Doctrine\ORM\EntityManagerInterface;
use Lc\ShopBundle\Context\MerchantUtilsInterface;
use Lc\ShopBundle\Context\OrderUtilsInterface;
use Lc\ShopBundle\Context\ProductFamilyInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Security;

class FavoriteController extends BaseController
{
        protected $productFamilyRepository ;

        public function __construct(EntityManagerInterface $em, Security $security, MerchantUtilsInterface $merchantUtils)
        {
                parent::__construct($em, $security, $merchantUtils);
                $this->productFamilyRepository = $this->em->getRepository($this->em->getClassMetaData(ProductFamilyInterface::class)->getName()) ;
        }

        public function toggle(Request $request)
        {
                $user = $this->_getUser() ;
                $productFamily = $this->_getProductFamily($request) ;

                if($user->getFavoriteProductFamilies()->contains($productFamily)) {
                        $user->removeFavoriteProductFamily($productFamily) ;
                        $isFavorite = false ;
                        $message = 'Le produit a bien été supprimé de vos favoris' ;
                }
                else {
                        $user->addFavoriteProductFamily($productFamily) ;
                        $isFavorite = true ;
                        $message = 'Le produit a bien été ajouté à vos favoris' ;
                }

                $this->_saveUser($user) ;

                return new JsonResponse([
                        'return' => 'success',
                        'is_favorite' => $isFavorite,
                        'message' => $message
                ]) ;
        }

        public function add(Request $request)
        {
                $user = $this->_getUser() ;
                $productFamily = $this->_getProductFamily($request) ;

                $user->addFavoriteProductFamily($productFamily) ;
                $this->_saveUser($user) ;

                return new JsonResponse([
                        'return' => 'success',
                        'message' => 'Le produit a bien été ajouté à vos favoris'
                ]) ;
        }

        public function delete(Request $request)
        {
                $user = $this->_getUser() ;
                $productFamily = $this->_getProductFamily($request) ;

                $user->removeFavoriteProductFamily($productFamily) ;
                $this->_saveUser($user) ;

                return new JsonResponse([
                        'return' => 'success',
                        'message' => 'Le produit a bien été supprimé de vos favoris'
                ]) ;
        }

        private function _getUser()
        {
                $user = $this->security->getUser() ;
                if(!$user) {
                        throw new \ErrorException('Vous devez être connecté pour gérer vos favoris') ;
                }

                return $user ;
        }

        private function _saveUser($user)
        {
                $this->em->persist($user);
                $this->em->flush() ;
        }

        private function _getProductFamily($request)
        {
                $idProductFamily = $request->request->get('idProductFamily') ;
                $productFamily = $this->productFamilyRepository->find($idProductFamily) ;

                if($productFamily) {
                        return $productFamily ;
                }
                else {
                        throw new \ErrorException('Ce produit est introuvable') ;
                }
        }
}
