<?php
declare(strict_types=1);

namespace Autogedal\EanTools\Controller\Adminhtml\Validate;

use Autogedal\EanTools\Controller\Adminhtml\AbstractFormatTool;
use Autogedal\EanTools\Model\Spreadsheet\Format;
use Autogedal\EanTools\Model\Tool\ExportScheduler;
use Autogedal\EanTools\Model\UploadHandler;
use Magento\Backend\App\Action\Context;
use Magento\Framework\App\Action\HttpPostActionInterface;
use Magento\Framework\Controller\ResultInterface;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\View\Result\PageFactory;
use Psr\Log\LoggerInterface;
use Throwable;

class Post extends AbstractFormatTool implements HttpPostActionInterface
{
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory,
        Format $format,
        private readonly UploadHandler $uploadHandler,
        private readonly ExportScheduler $scheduler,
        private readonly LoggerInterface $logger
    ) {
        parent::__construct($context, $resultPageFactory, $format);
    }

    public function execute(): ResultInterface
    {
        $uploaded = null;

        try {
            $uploaded = $this->uploadHandler->handle('ean_file', (string)__('EAN code file'));
            $runId = $this->scheduler->scheduleValidation($uploaded, $this->resolveFormat());
            $this->messageManager->addSuccessMessage(
                (string)__('The file has been queued and will be validated by cron.')
            );

            return $this->redirectTo('*/result/index', ['run' => $runId]);
        } catch (LocalizedException $e) {
            $this->logger->warning('Autogedal_EanTools validator: ' . $e->getMessage(), ['exception' => $e]);
            $this->messageManager->addErrorMessage($e->getMessage());
        } catch (Throwable $e) {
            $this->logger->error('Autogedal_EanTools validator: ' . $e->getMessage(), ['exception' => $e]);
            $this->messageManager->addErrorMessage((string)__('The EAN code file could not be validated.'));
        } finally {
            if ($uploaded !== null) {
                $this->uploadHandler->cleanup([$uploaded['path']]);
            }
        }

        return $this->redirectTo('*/validate/index');
    }
}
