<?php
declare(strict_types=1);

namespace Autogedal\BlackFriday\Controller\Unsubscribe;

use Autogedal\BlackFriday\Model\Config;
use Autogedal\BlackFriday\Model\SubscriberStorage;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\App\RequestInterface;
use Magento\Framework\Controller\Result\RedirectFactory;
use Magento\Framework\Exception\LocalizedException;
use Magento\Framework\Message\ManagerInterface;
use Magento\Framework\UrlInterface;
use Magento\Newsletter\Model\SubscriberFactory;
use Psr\Log\LoggerInterface;

/**
 * Unsubscribe link of the launch email: same as the core newsletter/subscriber/unsubscribe (the subscriber save
 * still triggers the TheMarketer removal), but the user lands back on the campaign page with a visible confirmation.
 */
class Index implements HttpGetActionInterface
{
    public function __construct(
        private readonly RequestInterface $request,
        private readonly SubscriberFactory $subscriberFactory,
        private readonly RedirectFactory $redirectFactory,
        private readonly UrlInterface $urlBuilder,
        private readonly ManagerInterface $messageManager,
        private readonly Config $config,
        private readonly SubscriberStorage $storage,
        private readonly LoggerInterface $logger
    ) {
    }

    public function execute()
    {
        $id = (int)$this->request->getParam('id');
        $code = (string)$this->request->getParam('code');
        $done = false;
        if ($id && $code !== '') {
            try {
                $subscriber = $this->subscriberFactory->create()->load($id)->setCheckCode($code)->unsubscribe();
                // already unsubscribed = no save, no observer: mark the campaign row here too
                $this->storage->skipUnsubscribed((string)$subscriber->getSubscriberEmail());
                $done = true;
            } catch (LocalizedException $e) {
                // invalid or old code: reported to the user below
            } catch (\Throwable $e) {
                $this->logger->error('Black Friday unsubscribe failed: ' . $e->getMessage(), ['exception' => $e]);
            }
        }

        if (!$this->config->isEnabled()) {
            // campaign page switched off after Black Friday: core behaviour (homepage + message)
            $done
                ? $this->messageManager->addSuccessMessage(__('You unsubscribed.'))
                : $this->messageManager->addErrorMessage(__('Something went wrong while unsubscribing you.'));
            return $this->redirectFactory->create()->setUrl($this->urlBuilder->getBaseUrl());
        }

        return $this->redirectFactory->create()->setUrl($this->urlBuilder->getUrl('black-friday', [
            '_nosid' => true,
            '_query' => ['newsletter' => $done ? 'dezabonat' : 'eroare'],
        ]));
    }
}
