<?php

declare(strict_types=1);

namespace App\Message\Handler;

use App\Message\Message\OrganizationDeletion;
use App\Service\Organization\OrganizationFactory;
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
use Symfony\Component\Mime\Address;
use Symfony\Component\Mime\Email as SymfonyEmail;

#[AsMessageHandler(priority: 1)]
readonly class OrganizationDeletionHandler
{
    public function __construct(
        private OrganizationFactory $organizationFactory,
        private MailerInterface $symfonyMailer,
        private string $opentalentMailReport,
    ) {
    }

    /**
     * @throws \Throwable
     * @throws TransportExceptionInterface
     */
    public function __invoke(OrganizationDeletion $organizationDeletionCommand): void
    {
        $organizationCreationRequest = $organizationDeletionCommand->getOrganizationDeletionRequest();

        try {
            $this->organizationFactory->delete($organizationCreationRequest);

            $this->sendMail(
                $organizationCreationRequest->getSendConfirmationEmailAt() ?? $this->opentalentMailReport,
                'Organization deleted',
                'The organization n° '.$organizationCreationRequest->getOrganizationId().' has been deleted successfully.',
            );
        } catch (\Exception $e) {
            $this->sendMail(
                $organizationCreationRequest->getSendConfirmationEmailAt() ?? $this->opentalentMailReport,
                'Organization deletion : an error occurred',
                'An error occurred while deleting the new organization : \n'.$e->getMessage()
            );
            throw $e;
        }
    }

    /**
     * @throws TransportExceptionInterface
     */
    private function sendMail(
        string $to,
        string $subject,
        string $content,
    ): void {
        $symfonyMail = (new SymfonyEmail())
            ->from($this->opentalentMailReport)
            ->replyTo($this->opentalentMailReport)
            ->returnPath(Address::create($this->opentalentMailReport))
            ->to($to)
            ->subject($subject)
            ->text($content);
        $this->symfonyMailer->send($symfonyMail);
    }
}
