<?php

namespace Lc\SovBundle\Notification;

use Lc\SovBundle\Definition\SiteSettingDefinition;
use Lc\SovBundle\Repository\Site\SiteStore;
use Lc\SovBundle\Solver\Setting\SettingSolver;
use Mailjet\MailjetSwiftMailer\SwiftMailer\MailjetTransport;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Twig\Environment;

class   MailMailjetNotification
{
    const SUBJECT = 'subject';
    const SUBJECT_PREFIX = 'subject-prefix';
    const TO_EMAIL = 'to-email';
    const COPY_TO = 'copy-to';
    const COPY_HIDDEN_TO = 'copy-hidden-to';
    const TO_NAME = 'to-name';
    const FROM_EMAIL = 'from-email';
    const FROM_NAME = 'from-name';
    const REPLY_TO = 'reply-to';
    const CONTENT_TEMPLATE = 'content-template';
    const CONTENT_DATA = 'content-data';
    const ATTACHMENT_DATA = 'attachment-data';
    const ATTACHMENT_FILENAME = 'attachment-filename';
    const ATTACHMENT_CONTENT_TYPE = 'attachment-content-type';

    protected MailjetTransport $transport;
    protected Environment $templating;
    protected ParameterBagInterface $parameterBag;
    protected SettingSolver $settingSolver;
    protected SiteStore $siteStore;

    public function __construct(
            MailjetTransport $mailjetTransport,
            Environment $templating,
            ParameterBagInterface $parameterBag,
            SettingSolver $settingSolver,
            SiteStore $siteStore
    ) {
        $this->transport = $mailjetTransport;
        $this->templating = $templating;
        $this->parameterBag = $parameterBag;
        $this->settingSolver = $settingSolver;
        $this->siteStore = $siteStore;
    }

    public function send($params = [])
    {
        $siteDefault = $this->siteStore->getOneDefault();

        $emailSubjectPrefix = (isset($params[self::SUBJECT_PREFIX]) && $params[self::SUBJECT_PREFIX] && strlen($params[self::SUBJECT_PREFIX]) > 0)
                ? $params[self::SUBJECT_PREFIX]
                : $this->settingSolver->getSettingValue(
                        $siteDefault,
                        SiteSettingDefinition::SETTING_EMAIL_SUBJECT_PREFIX
                );

        $emailFrom = (isset($params[self::FROM_EMAIL]) && $params[self::FROM_EMAIL] && strlen($params[self::FROM_EMAIL]) > 0)
                ? $params[self::FROM_EMAIL]
                :  $this->settingSolver->getSettingValue(
                        $siteDefault,
                        SiteSettingDefinition::SETTING_EMAIL_FROM
                );

        $emailFromName = (isset($params[self::FROM_NAME]) && $params[self::FROM_NAME] && strlen($params[self::FROM_NAME]) > 0)
                ? $params[self::FROM_NAME]
                : $this->settingSolver->getSettingValue(
                        $siteDefault,
                        SiteSettingDefinition::SETTING_EMAIL_FROM_NAME
                );

        $message = new \Swift_Message($emailSubjectPrefix . $params[self::SUBJECT]);

        if ($this->parameterBag->get('mailjet.dev.redirect.active') == 1) {
            $message->addTo(
                    $this->parameterBag->get('mailjet.dev.redirect.email'),
                    isset($params[self::TO_NAME]) ?? null
            );
        } else {
            $message->addTo(
                    $params[self::TO_EMAIL],
                    isset($params[self::TO_NAME]) ?? null
            );
        }

        $contentData = [];
        if (isset($params[self::CONTENT_DATA])) {
            $contentData = $params[self::CONTENT_DATA];
        }

        $message->addFrom($emailFrom, $emailFromName)
                ->setBody(
                        $this->templating->render($params[self::CONTENT_TEMPLATE] . '-html.html.twig', $contentData),
                        'text/html'
                )
                ->addPart($this->templating->render($params[self::CONTENT_TEMPLATE] . '-text.html.twig', $contentData));

        if (isset($params[self::COPY_TO]) && strlen($params[self::COPY_TO])) {
            $message->addCc($params[self::COPY_TO]);
        }

        if (isset($params[self::COPY_HIDDEN_TO]) && strlen($params[self::COPY_HIDDEN_TO])) {
            $message->addBcc($params[self::COPY_HIDDEN_TO]);
        }

        if (isset($params[self::REPLY_TO]) && strlen($params[self::REPLY_TO])) {
            $message->addReplyTo($params[self::REPLY_TO]);
        }

        if (isset($params[self::ATTACHMENT_DATA]) && isset($params[self::ATTACHMENT_FILENAME]) && isset($params[self::ATTACHMENT_CONTENT_TYPE])) {
            $message->attach(
                    \Swift_Attachment::newInstance(
                            $params[self::ATTACHMENT_DATA],
                            $params[self::ATTACHMENT_FILENAME],
                            $params[self::ATTACHMENT_CONTENT_TYPE]
                    )
            );
        }

        return $this->transport->send($message);
    }
}
