<?php

namespace FiloBlu\Rma\Plugin\Rma\Helper;

use Exception;
use FiloBlu\Rma\Helper\ChangeSizeAttributeHelper;
use Magento\Framework\App\RequestInterface;
use Magento\Rma\Helper\Eav as RmaEavHelper;
use Magento\Sales\Api\OrderRepositoryInterface;
use Magento\Store\Model\StoreManagerInterface;
use Psr\Log\LoggerInterface;

/**
 *
 */
class Eav
{
    /**
     * @var ChangeSizeAttributeHelper
     */
    private $changeSizeAttributeHelper;
    /**
     * @var OrderRepositoryInterface
     */
    private $orderRepository;
    /**
     * @var StoreManagerInterface
     */
    private $storeManager;
    /**
     * @var RequestInterface
     */
    private $request;
    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * @param ChangeSizeAttributeHelper $changeSizeAttributeHelper
     * @param OrderRepositoryInterface $orderRepository
     * @param StoreManagerInterface $storeManager
     * @param RequestInterface $request
     * @param LoggerInterface $logger
     */
    public function __construct(
        ChangeSizeAttributeHelper $changeSizeAttributeHelper,
        OrderRepositoryInterface  $orderRepository,
        StoreManagerInterface     $storeManager,
        RequestInterface          $request,
        LoggerInterface           $logger
    )
    {
        $this->changeSizeAttributeHelper = $changeSizeAttributeHelper;
        $this->orderRepository = $orderRepository;
        $this->storeManager = $storeManager;
        $this->request = $request;
        $this->logger = $logger;
    }

    /**
     * Toglie l'opzione Change Size dalle select della resolution in creazione RMA da admin quando
     * la feature e' disabilitata sul website dell'ordine. Senza questo filtro il backend espone
     * l'opzione anche dove il frontend correttamente non la mostra, e il reso viene salvato con
     * resolution Change Size senza che venga generato l'ordine di cambio taglia: il cliente resta
     * senza cambio taglia e senza rimborso.
     *
     * Il filtro si applica solo alle pagine con order_id in request, cioe' la creazione: sulla
     * edit di un RMA gia' salvato rimuovere l'opzione svuoterebbe la select del valore corrente.
     *
     * @param RmaEavHelper $subject
     * @param array $result
     * @param string|null $attributeCode
     * @return array
     */
    public function afterGetAttributeOptionValues(
        RmaEavHelper $subject,
                     $result,
                     $attributeCode = null
    )
    {
        if ($attributeCode !== 'resolution' || !is_array($result)) {
            return $result;
        }

        $orderId = $this->request->getParam('order_id');

        if (empty($orderId)) {
            return $result;
        }

        try {
            $order = $this->orderRepository->get($orderId);
            $websiteId = (int)$this->storeManager->getStore($order->getStoreId())->getWebsiteId();

            if ($this->changeSizeAttributeHelper->isChangeSizeEnabled($websiteId)) {
                return $result;
            }

            unset($result[$this->changeSizeAttributeHelper->getChangeSizeAttributeOptionId()]);
        } catch (Exception $e) {
            $this->logger->critical($e->getMessage(), ['exception' => $e]);
        }

        return $result;
    }
}
