<?php
/**
 * Mageplaza
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Mageplaza.com license that is
 * available through the world-wide-web at this URL:
 * https://www.mageplaza.com/LICENSE.txt
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade this extension to newer
 * version in the future.
 *
 * @category    Mageplaza
 * @package     Mageplaza_EditOrder
 * @copyright   Copyright (c) Mageplaza (https://www.mageplaza.com/)
 * @license     https://www.mageplaza.com/LICENSE.txt
 */
namespace Mageplaza\EditOrder\Plugin\Order;

use Magento\Backend\Model\View\Result\Page;
use Magento\Backend\Model\View\Result\Redirect;
use Magento\Quote\Model\QuoteFactory;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Sales\Controller\Adminhtml\Order\View as OrderView;
use Mageplaza\EditOrder\Helper\Data as EditOrderHelper;
use Mageplaza\EditOrder\Model\PreviousCartFactory as PreviousCartFactory;
use Mageplaza\EditOrder\Model\Quote\QuoteManagement;
use Psr\Log\LoggerInterface;

/**
 * Class Logs
 * @package Mageplaza\EditOrder\Plugin\Order
 */
class OrderViewPlugin
{
    /**
     * @var EditOrderHelper
     */
    protected $editOrderHelper;

    /**
     * @var QuoteFactory
     */
    protected $quoteFactory;

    /**
     * @var OrderRepositoryInterface
     */
    protected $orderRepository;

    /**
     * @var QuoteManagement
     */
    protected $quoteManagement;

    /**
     * @var PreviousCartFactory
     */
    protected $previousCartFactory;

    /**
     * @var LoggerInterface
     */
    protected $_logger;

    /**
     * Constructor
     *
     * @param EditOrderHelper $editOrderHelper
     * @param OrderRepositoryInterface $orderRepository
     * @param QuoteFactory $quoteFactory
     * @param QuoteManagement $quoteManagement
     * @param PreviousCartFactory $previousCartFactory
     * @param LoggerInterface $logger
     */
    public function __construct(
        EditOrderHelper $editOrderHelper,
        OrderRepositoryInterface $orderRepository,
        QuoteFactory $quoteFactory,
        QuoteManagement $quoteManagement,
        PreviousCartFactory $previousCartFactory,
        LoggerInterface $logger
    ) {
        $this->editOrderHelper     = $editOrderHelper;
        $this->orderRepository     = $orderRepository;
        $this->quoteFactory        = $quoteFactory;
        $this->quoteManagement     = $quoteManagement;
        $this->previousCartFactory = $previousCartFactory;
        $this->_logger             = $logger;
    }

    /**
     * After method execute
     *
     * @param OrderView $subject
     * @param Page|Redirect $result
     *
     * @return Page|Redirect
     */
    public function afterExecute(OrderView $subject, $result)
    {
        $currentItems  = [];
        $itemIdInOrder = [];

        $orderId = $subject->getRequest()->getParam('order_id');
        $order   = $this->orderRepository->get($orderId);

        if ($order) {
            $quote = $this->quoteFactory->create()->load($order->getQuoteId());

            foreach ($order->getItems() as $item) {
                $itemIdInOrder[] = $item->getQuoteItemId();
            }
            if (!empty($this->quoteManagement->getResolveItems($quote))) {
                foreach ($quote->getAllItems() as $quoteItem) {
                    $currentItems[$quoteItem->getItemId()] = $quoteItem->getData();
                }
            }
            $previousCartModel = $this->previousCartFactory->create();

            try {
                $previousCartModel->saveOrUpdate($orderId, $quote->getId(), $currentItems, $itemIdInOrder);
            } catch (\Exception $e) {
                $this->_logger->critical($e->getMessage());
            }
        }

        return $result;
    }
}
