<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Persistent\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Exception\NoSuchEntityException;

/**
 * Observer to remove persistent session if guest empties persistent cart previously created and added to by customer.
 */
class RemoveGuestPersistenceOnEmptyCartObserver implements ObserverInterface
{
    /**
     * Customer session
     *
     * @var \Magento\Customer\Model\Session
     */
    private $customerSession;

    /**
     * Persistent session
     *
     * @var \Magento\Persistent\Helper\Session
     */
    private $persistenceSessionHelper;

    /**
     * Quote manager
     *
     * @var \Magento\Persistent\Model\QuoteManager
     */
    private $quoteManager;

    /**
     * Persistent Data
     *
     * @var \Magento\Persistent\Helper\Data
     */
    private $persistenceDataHelper;

    /**
     * Cart Repository
     *
     * @var \Magento\Quote\Api\CartRepositoryInterface $cartRepository
     */
    private $cartRepository;

    /**
     * Initialize dependencies
     *
     * @param \Magento\Persistent\Helper\Session $persistenceSessionHelper
     * @param \Magento\Persistent\Helper\Data $persistenceDataHelper
     * @param \Magento\Persistent\Model\QuoteManager $quoteManager
     * @param \Magento\Customer\Model\Session $customerSession
     * @param \Magento\Quote\Api\CartRepositoryInterface $cartRepository
     */
    public function __construct(
        \Magento\Persistent\Helper\Session $persistenceSessionHelper,
        \Magento\Persistent\Helper\Data $persistenceDataHelper,
        \Magento\Persistent\Model\QuoteManager $quoteManager,
        \Magento\Customer\Model\Session $customerSession,
        \Magento\Quote\Api\CartRepositoryInterface $cartRepository
    ) {
        $this->persistenceSessionHelper = $persistenceSessionHelper;
        $this->customerSession = $customerSession;
        $this->quoteManager = $quoteManager;
        $this->persistenceDataHelper = $persistenceDataHelper;
        $this->cartRepository = $cartRepository;
    }

    /**
     * Set persistent session to guest if cart has been emptied and customer not logged in
     *
     * @param \Magento\Framework\Event\Observer $observer
     * @return void
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        if (!$this->persistenceSessionHelper->isPersistent()
            || $this->customerSession->isLoggedIn()
            || !$this->persistenceDataHelper->isShoppingCartPersist()
        ) {
            return;
        }

        try {
            $custId = $this->persistenceSessionHelper->getSession()->getCustomerId();
            /** @var \Magento\Quote\Api\Data\CartInterface $cart */
            $cart = $this->cartRepository->getActiveForCustomer($custId);
        } catch (NoSuchEntityException $entityException) {
            $cart = null;
        }

        if (!$cart || $cart->getItemsCount() == 0) {
            $this->quoteManager->setGuest();
        }
    }
}