<?php
/**
 * @author  Magediary
 * @package Magediary_ProductQuestion
 */

namespace Magediary\ProductQuestion\Controller\Answer;

use Magediary\ProductQuestion\Model\ResourceModel\ActivityLog;
use Magediary\ProductQuestion\Model\ResourceModel\Answer;
use Magediary\ProductQuestion\Model\Email\MailAbuseInterface;
use Magento\Customer\Model\Session;
use Magento\Framework\App\Action\Action;
use Magento\Framework\App\Action\Context;
use Magento\Framework\Json\Helper\Data;
use Magento\Framework\View\Result\PageFactory;
use Psr\Log\LoggerInterface;
use Magento\Framework\DataObject;
use Magento\Framework\UrlInterface;

class Trigger extends Action
{
    /**
     * @var \Magento\Framework\View\Result\Page
     */
    protected $resultPageFactory;

    /**
     * @var Data
     */
    protected $jsonHelper;

    /**
     * @var Answer
     */
    protected $resourceAnswer;

    /**
     * @var ActivityLog
     */
    protected $resourceLog;

    /**
     * @var MailAbuseInterface
     */
    protected $mailAbuse;

    /**
     * @var UrlInterface
     */
    protected $urlBuilder;

    /**
     * @var  Session
     */
    public $customerSession;

    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * @param Context $context
     * @param PageFactory $resultPageFactory
     * @param Data $jsonHelper
     * @param Session $customerSession
     * @param Answer $resourceAnswer
     * @param ActivityLog $resourceLog
     * @param MailAbuseInterface $mailAbuse
     * @param UrlInterface $urlBuilder
     * @param LoggerInterface $logger
     */
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory,
        Data $jsonHelper,
        Session $customerSession,
        Answer $resourceAnswer,
        ActivityLog $resourceLog,
        MailAbuseInterface $mailAbuse,
        UrlInterface $urlBuilder,
        LoggerInterface $logger
    ) {
        $this->customerSession = $customerSession;
        $this->resultPageFactory = $resultPageFactory;
        $this->jsonHelper = $jsonHelper;
        $this->resourceAnswer = $resourceAnswer;
        $this->resourceLog = $resourceLog;
        $this->mailAbuse = $mailAbuse;
        $this->urlBuilder = $urlBuilder;
        $this->logger = $logger;
        parent::__construct($context);
    }

    /**
     * Execute trigger action for like, dislike and abuse
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        $id = $this->getRequest()->getParam('id');
        $type = $this->getRequest()->getParam('type');
        $productId = $this->getRequest()->getParam('product_id');

        try {
            if ($this->customerSession->isLoggedIn()) {
                $customerId = $this->customerSession->getCustomerId();
                $abuse = 0;

                if ($type=='like' || $type=='dislike') {
                    $this->resourceLog->revertLikes($id, $customerId);
                }
                switch ($type) {
                    case 'like':
                        $this->resourceLog->addLikeLog($id, $customerId, $productId);
                        $this->resourceAnswer->updateLikeDislikeCount($id);
                        break;
                    case 'dislike':
                        $this->resourceLog->addDislikeLog($id, $customerId, $productId);
                        $this->resourceAnswer->updateLikeDislikeCount($id);
                        break;
                    case 'abuse':
                        if ($this->resourceLog->getAbuseCount($id, $customerId) == 0) {
                            $this->resourceLog->reportAbuse($id, $customerId, $productId);
                            $this->sendAbuseEmail($id, $customerId, $productId);
                            $abuse = 1;
                        }
                        break;
                }
            } else {
                $response['alert'] = __(
                    'Please <a href="%1">Sign in</a> or <a href="%2">create an account</a> first.',
                    $this->getLoginUrl(),
                    $this->getRegisterUrl()
                );
                return $this->jsonResponse($response);
            }

            $response = [
                'likes' => $this->resourceLog->getLikeCount($id),
                'dislikes' => $this->resourceLog->getDislikeCount($id),
                'abuse' => $abuse
                ];

            $this->_eventManager->dispatch(
                'magediary_productquestion_activitylog_trigger',
                ['product_id' => $productId]
            );

            return $this->jsonResponse($response);
        } catch (\Magento\Framework\Exception\LocalizedException $e) {
            return $this->jsonResponse($e->getMessage());
        } catch (\Exception $e) {
            $this->logger->critical($e);
            return $this->jsonResponse($e->getMessage());
        }
    }

    /**
     * Create json response
     *
     * @param string $response
     * @return mixed
     */
    public function jsonResponse($response = '')
    {
        return $this->getResponse()->representJson(
            $this->jsonHelper->jsonEncode($response)
        );
    }

    /**
     * Send email
     *
     * @param int $id
     * @param int $customerId
     * @param int $productId
     */
    private function sendAbuseEmail($id, $customerId, $productId)
    {
        $this->mailAbuse->send(
            new DataObject(['id' => $id, 'customer_id' => $customerId, 'product_id' => $productId])
        );
    }

    /**
     * Retrieve customer login page url
     *
     * @return string
     */
    public function getLoginUrl()
    {
        return $this->urlBuilder->getUrl('customer/account/login');
    }

    /**
     * Retrieve customer register form url
     *
     * @return string
     */
    public function getRegisterUrl()
    {
        return $this->urlBuilder->getUrl('customer/account/create');
    }
}
