<?php

declare(strict_types=1);

namespace Autogedal\AwbRetry\Controller\Adminhtml\Error;

use Autogedal\AwbRetry\Model\Queue\RetryRequestPublisher;
use Autogedal\AwbRetry\Model\ResourceModel\Collection\ErrorLog\CollectionFactory;
use Magento\Backend\App\Action;
use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Ui\Component\MassAction\Filter;
class MassRetry extends Action
{
    public const ADMIN_RESOURCE = 'Autogedal_AwbRetry::awb_errors';

    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        private readonly Filter $filter,
        private readonly CollectionFactory $collectionFactory,
        private readonly RetryRequestPublisher $retryRequestPublisher
    ) {
        parent::__construct($context);
    }

    public function execute()
    {
        $selected = $this->getRequest()->getParam('selected');
        $excluded = $this->getRequest()->getParam('excluded');

        $collection = $this->collectionFactory->create();

        if ((is_array($selected) && !empty($selected)) || (is_array($excluded) && !empty($excluded))) {
            $this->filter->applySelectionOnTargetProvider();
            $collection = $this->filter->getCollection($collection);
        } elseif ('false' !== $excluded) {
            $this->messageManager->addNoticeMessage(__('No AWB error logs were selected.'));
            /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
            $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
            return $resultRedirect->setPath('*/*/index');
        }

        $queued = 0;
        try {
            foreach ($collection->getItems() as $log) {
                $this->retryRequestPublisher->queue(
                    (int) $log->getId(),
                    RetryRequestPublisher::RETRY_MODE_MANUAL
                );
                $queued++;
            }
            if ($queued) {
                $this->messageManager->addSuccessMessage(__('A total of %1 AWB manual retry request(s) were queued.', $queued));
            } else {
                $this->messageManager->addNoticeMessage(__('No AWB error logs were selected.'));
            }
        } catch (LocalizedException $e) {
            $this->messageManager->addErrorMessage($e->getMessage());
        } catch (\Throwable $e) {
            $this->messageManager->addExceptionMessage($e, __('Unable to queue selected AWB manual retries.'));
        }

        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        return $resultRedirect->setPath('*/*/index');
    }

    protected function _isAllowed(): bool
    {
        return $this->_authorization->isAllowed(self::ADMIN_RESOURCE);
    }
}
