<?php

declare(strict_types=1);

namespace App\Factory;

use App\Entity\PasswordToken;
use Swift_Message;
use Twig\Environment;

final class MailFactory
{
    /**
     * @var Environment
     */
    private $twig;
    /**
     * @var string
     */
    private $linkUrl;

    public function __construct(string $linkUrl, Environment $twig)
    {
        $this->twig = $twig;
        $this->linkUrl = $linkUrl;
    }

    public function make(PasswordToken $passwordToken): Swift_Message
    {
        switch ($passwordToken->getType()) {
            case 'NEW':
                $url = sprintf('%s/password/reset/confirm/%s', $this->getLinkUrl(), $passwordToken->getToken());
                $email = (new Swift_Message('[AkitaCRM] Welcome to AkitaCRM!'))
                    ->setFrom('no-reply@akita.crm.i3x.co.uk')
                    ->setBody($this->twig->render('Email/welcome.twig', ['url' => $url, 'name' => $passwordToken->getUser()->getFirstName()]), 'text/html')
                    ->setTo($passwordToken->getUser()->getEmail());

                break;
            case 'RESET':
                $url = sprintf('%s/password/reset/confirm/%s', $this->getLinkUrl(), $passwordToken->getToken());
                $email = (new Swift_Message('[AkitaCRM] Password reset requested'))
                    ->setFrom('no-reply@akita.crm.i3x.co.uk')
                    ->setBody($this->twig->render('Email/reset_password.twig', ['url' => $url, 'name' => $passwordToken->getUser()->getFirstName()]), 'text/html')
                    ->setTo($passwordToken->getUser()->getEmail());

                break;
            default:
                $url = sprintf('%s/password/reset/confirm/%s', $this->getLinkUrl(), $passwordToken->getToken());
                $email = (new Swift_Message('[AkitaCRM] Welcome to AkitaCRM!'))
                    ->setFrom('no-reply@akita.crm.i3x.co.uk')
                    ->setBody($this->twig->render('Email/welcome.twig', ['url' => $url, 'name' => $passwordToken->getUser()->getFirstName()]), 'text/html')
                    ->setTo($passwordToken->getUser()->getEmail());

                break;
        }

        return $email;
    }

    /**
     * @return string
     */
    public function getLinkUrl(): string
    {
        return $this->linkUrl;
    }
}
