<?php 
 
namespace Webkul\UVDesk\CoreFrameworkBundle\Controller; 
 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Bundle\FrameworkBundle\Controller\Controller; 
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; 
use Webkul\UVDesk\CoreFrameworkBundle\Form as CoreFrameworkBundleForms; 
use Webkul\UVDesk\CoreFrameworkBundle\Entity as CoreFrameworkBundleEntities; 
 
class SavedReplies extends Controller 
{ 
    const LIMIT = 10; 
    const ROLE_REQUIRED = 'saved_replies'; 
 
    public function loadSavedReplies(Request $request) 
    { 
        $savedReplyReferenceIds = $this->container->get('user.service')->getUserSavedReplyReferenceIds(); 
 
        return $this->render('@UVDeskCoreFramework//savedRepliesList.html.twig', [ 
            'savedReplyReferenceIds' => array_unique($savedReplyReferenceIds), 
        ]); 
    } 
 
    public function updateSavedReplies(Request $request) 
    { 
        $templateId = $request->attributes->get('template'); 
        $repository = $this->getDoctrine()->getRepository(CoreFrameworkBundleEntities\SavedReplies::class); 
 
        if (empty($templateId)) { 
            $template = new CoreFrameworkBundleEntities\SavedReplies(); 
        } else { 
            // @TODO: Refactor: We shouldn't be passing around the container. 
            $template = $repository->getSavedReply($templateId, $this->container); 
 
            if (empty($template)) { 
                $this->noResultFound(); 
            } 
        } 
 
        $errors = []; 
        if ($request->getMethod() == 'POST') { 
            if (empty($request->request->get('message'))) { 
                $this->addFlash('warning',  $this->get('translator')->trans('Error! Saved reply body can not be blank')); 
                 
                return $this->render('@UVDeskCoreFramework//savedReplyForm.html.twig', [ 
                    'template' => $template, 
                    'errors' => json_encode($errors) 
                ]); 
            } 
 
            $em = $this->getDoctrine()->getManager(); 
            $template->setName($request->request->get('name')); 
 
            // Groups 
            $previousGroupIds = []; 
            $groups = explode(',', $request->request->get('tempGroups')); 
 
            if ($template->getSupportGroups()) { 
                foreach ($template->getSupportGroups() as $key => $group) { 
                    $previousGroupIds[] = $group->getId(); 
                    
                    if (!in_array($group->getId(), $groups) && !empty($groups[0])) { 
                        $template->removeSupportGroups($group); 
                        $em->persist($template); 
                    } 
                } 
            } 
 
            foreach($groups as $key => $groupId) { 
                if ($groupId) { 
                    $group = $em->getRepository('UVDeskCoreFrameworkBundle:SupportGroup')->findOneBy([ 'id' => $groupId ]); 
 
                    if ($group && (empty($previousGroupIds) || !in_array($groupId, $previousGroupIds))) { 
                        $template->addSupportGroup($group); 
                        $em->persist($template); 
                    } 
                } 
            } 
 
            // Teams 
            $previousTeamIds = []; 
            $teams = explode(',', $request->request->get('tempTeams')); 
 
            if ($template->getSupportTeams()) { 
                foreach ($template->getSupportTeams() as $key => $team) { 
                    $previousTeamIds[] = $team->getId(); 
                    
                    if (!in_array($team->getId(), $teams) && !empty($teams[0])) { 
                        $template->removeSupportTeam($team); 
                        $em->persist($template); 
                    } 
                } 
            } 
 
            foreach ($teams as $key => $teamId) { 
                if ($teamId) { 
                    $team = $em->getRepository('UVDeskCoreFrameworkBundle:SupportTeam')->findOneBy([ 'id' => $teamId ]); 
 
                    if ($team && (empty($previousTeamIds) || !in_array($teamId, $previousTeamIds))) { 
                        $template->addSupportTeam($team); 
                        $em->persist($template); 
                    } 
                } 
            } 
 
            $template->setMessage($request->request->get('message')); 
 
            if (empty($template->getUser()))  { 
                $template->setUser($this->getUser()->getAgentInstance()); 
            } 
             
            $em->persist($template); 
            $em->flush(); 
 
            $this->addFlash('success', $request->attributes->get('template') ? 'Success! Reply has been updated successfully.': 'Success! Reply has been added successfully.'); 
            return $this->redirectToRoute('helpdesk_member_saved_replies'); 
        } 
 
        return $this->render('@UVDeskCoreFramework//savedReplyForm.html.twig', array( 
            'template' => $template, 
            'errors' => json_encode($errors) 
        )); 
    } 
 
    public function savedRepliesXHR(Request $request) 
    { 
       
        $entityManager = $this->getDoctrine()->getManager(); 
        $savedReplyRepository = $entityManager->getRepository('UVDeskCoreFrameworkBundle:SavedReplies'); 
 
        if ($request->getMethod() == 'GET') { 
            $responseContent = $savedReplyRepository->getSavedReplies($request->query, $this->container); 
        } else { 
            $savedReplyId = $request->attributes->get('template'); 
 
            if (null == $savedReplyId || $request->getMethod() != 'DELETE') { 
                throw new \Exception(404); 
            } else { 
                $savedReply = $savedReplyRepository->findOneBy(['id' => $savedReplyId]); 
 
                if (empty($savedReply)) { 
                    throw new \Exception(404); 
                } 
            } 
 
            $entityManager->remove($savedReply); 
            $entityManager->flush(); 
 
            $responseContent = [ 
                'alertClass' => 'success', 
                'alertMessage' => 'Success! Saved Reply has been deleted successfully.' 
            ]; 
        } 
 
        return new Response(json_encode($responseContent), 200, ['Content-Type' => 'application/json']); 
    } 
 
    private function getId($item) 
    { 
        return $item->getId(); 
    } 
}