<?php

declare(strict_types=1);

namespace Autogedal\AwbRetry\Model;

use Magento\Framework\App\Area;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Magento\Framework\DataObject;
use Magento\Framework\Mail\Template\TransportBuilder;
use Magento\Store\Model\ScopeInterface;
use Magento\Store\Model\Store;
use Psr\Log\LoggerInterface;

class FailureEmailSender
{
    public function __construct(
        private readonly Config $config,
        private readonly TransportBuilder $transportBuilder,
        private readonly ScopeConfigInterface $scopeConfig,
        private readonly LoggerInterface $logger
    ) {
    }

    public function send(ErrorLog $log): bool
    {
        $templateId = $this->config->getFailureEmailTemplate();
        $recipients = $this->config->getFailureEmailRecipients();

        if ($templateId === '') {
            return false;
        }

        $senderEmail = trim((string) $this->scopeConfig->getValue('trans_email/ident_support/email', ScopeInterface::SCOPE_STORE));
        $senderName = trim((string) $this->scopeConfig->getValue('trans_email/ident_support/name', ScopeInterface::SCOPE_STORE));
        if ($senderEmail === '') {
            $this->logger->warning(__('AWB retry failure email skipped because the support sender email is not configured.'));
            return false;
        }

        if ($senderName === '') {
            $senderName = $senderEmail;
        }

        if ($recipients === []) {
            $recipients = [$senderEmail];
            $this->logger->warning(
                (string) __('AWB retry failure email recipient list is empty; falling back to the support address %1.', $senderEmail)
            );
        }

        try {
            $transportBuilder = $this->transportBuilder
                ->setTemplateIdentifier($templateId)
                ->setTemplateOptions([
                    'area' => Area::AREA_FRONTEND,
                    'store' => Store::DEFAULT_STORE_ID,
                ])
                ->setTemplateVars([
                    'log' => new DataObject($log->getData()),
                ])
                ->setFrom([
                    'name' => $senderName,
                    'email' => $senderEmail,
                ]);

            foreach ($recipients as $recipient) {
                $transportBuilder->addTo($recipient);
            }

            $transportBuilder->getTransport()->sendMessage();
            return true;
        } catch (\Throwable $throwable) {
            $this->logger->error(
                (string) __('Unable to send AWB retry failure email for log %1: %2', (string) $log->getId(), $throwable->getMessage()),
                ['exception' => $throwable]
            );

            return false;
        }
    }
}
