<?php

namespace SGalinski\SgMail\Service;

use SGalinski\SgMail\Domain\Model\Mail;
use SGalinski\SgMail\Domain\Repository\MailRepository;
use TYPO3\CMS\Core\Mail\MailMessage;
use TYPO3\CMS\Core\Utility\GeneralUtility;
use TYPO3\CMS\Extbase\Object\ObjectManager;
use TYPO3\CMS\Fluid\View\StandaloneView;

/***************************************************************
 *  Copyright notice
 *
 *  (c) sgalinski Internet Services (https://www.sgalinski.de)
 *
 *  All rights reserved
 *
 *  This script is part of the TYPO3 project. The TYPO3 project is
 *  free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 3 of the License, or
 *  (at your option) any later version.
 *
 *  The GNU General Public License can be found at
 *  http://www.gnu.org/copyleft/gpl.html.
 *
 *  This script is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  This copyright notice MUST APPEAR in all copies of the script!
 ***************************************************************/

/**
 * MailTemplateService
 */
class MailTemplateService {

	/**
	 * @var array
	 */
	private static $registerArray = [];

	/**
	 * @var array to
	 */
	private $to = [];

	/**
	 * @var string from
	 */
	private $from;

	/**
	 * @var string $cc
	 */
	private $cc;

	/**
	 * @var string replyTo
	 */
	private $replyTo;

	/**
	 * @var string language
	 */
	private $language = 'de';

	/**
	 * @var boolean ignoreMailQueue
	 */
	private $ignoreMailQueue = TRUE;

	/**
	 * @var \TYPO3\CMS\Core\Mail\MailMessage $mailMessage
	 */
	private $mailMessage;

	/**
	 * @var string templateName
	 */
	private $templateName;

	/**
	 * @var string extensionKey
	 */
	private $extensionKey;

	/**
	 * @var array content
	 */
	private $markers = [];

	/**
	 * @var string subject
	 */
	private $subject;

	/**
	 * MailTemplateService constructor.
	 */
	public function __construct() {
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
		$this->mailMessage = $objectManager->get(MailMessage::class);
	}

	/**
	 * register a template with sg_mail
	 *
	 * @param string $extension
	 * @param string $templateName
	 * @param string $templatePath
	 * @param string $description
	 * @param array $markers
	 * @return string
	 */
	public static function registerTemplate($extension, $templateName, $templatePath, $description, array $markers) {

		MailTemplateService::$registerArray[$extension][$templateName] = [
			'templatePath' => $templatePath,
			'description' => $description,
			'marker' => $markers,
			'extension' => $extension,
			'templateName' => $templateName
		];
	}

	/**
	 * Get all registered templates
	 *
	 * @return array
	 */
	public static function getRegisterArray() {
		return self::$registerArray;
	}

	/**
	 * Send the Email
	 */
	public function sendEmail() {
		$registerArray = MailTemplateService::getRegisterArray();
		$templateEntry = $registerArray[$this->extensionKey][$this->templateName];

		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);
		$emailView = $objectManager->get(StandaloneView::class);
		$emailView->setTemplatePathAndFilename(
			$templateEntry['templatePath'] . $this->language . '.sg_mail.locallang.html'
		);
		$emailView->assignMultiple($this->markers);
		$emailBody = $emailView->render();

		if ($this->ignoreMailQueue) {

			$this->mailMessage->setSubject($this->subject);
			$this->mailMessage->setBody($emailBody, 'text/html');
			$this->mailMessage->send();
		} else {
			$this->addMailToMailQueue($emailBody);
		}
	}

	/**
	 * Adds a new mail to the mail queue.
	 *
	 * @param string $emailBody
	 */
	private function addMailToMailQueue($emailBody, $priority = Mail::PRIORITY_LOWEST, $pid = 0) {
		/** @var ObjectManager $objectManager */
		$objectManager = GeneralUtility::makeInstance(ObjectManager::class);

		if ($pid <= 0 && isset($GLOBALS['TSFE'])) {
			$pid = (int) $GLOBALS['TSFE']->id;
		}

		$mail = $objectManager->get(Mail::class);
		$mail->setPid($pid);
		$mail->setFromAddress($this->from);
		$mail->setToAddress($this->to);
		$mail->setMailSubject($this->subject);
		$mail->setMailBody($emailBody);
		$mail->setPriority($priority);

		$mailRepository = $objectManager->get(MailRepository::class);
		$mailRepository->add($mail);
	}

	/**
	 * @param array $registerArray
	 * @return MailTemplateService
	 */
	public static function setRegisterArray(array $registerArray) {
		self::$registerArray = $registerArray;
	}

	/**
	 * @param array | string $to
	 * @return MailTemplateService
	 */
	public function setTo($to) {
		$this->to = $to;
		$this->mailMessage->setTo($to);
		return $this;
	}

	/**
	 * @param array | string $from
	 * @return MailTemplateService
	 */
	public function setFrom($from) {
		$this->from = $from;
		$this->mailMessage->setFrom($from);
		return $this;
	}

	/**
	 * @param array | string $cc
	 * @return MailTemplateService
	 */
	public function setCc($cc) {
		$this->cc = $cc;
		$this->mailMessage->setCc($cc);
		return $this;
	}

	/**
	 * @param array | string $replyTo
	 * @return MailTemplateService
	 */
	public function setReplyTo($replyTo) {
		$this->replyTo = $replyTo;
		$this->mailMessage->setReplyTo($replyTo);
		return $this;
	}

	/**
	 * @param string $language
	 * @return MailTemplateService
	 */
	public function setLanguage($language) {
		$this->language = $language;
		return $this;
	}

	/**
	 * @param boolean $ignoreMailQueue
	 * @return MailTemplateService
	 */
	public function setIgnoreMailQueue($ignoreMailQueue) {
		$this->ignoreMailQueue = $ignoreMailQueue;
		return $this;
	}

	/**
	 * @param string $templateName
	 * @return MailTemplateService
	 */
	public function setTemplateName($templateName) {
		$this->templateName = $templateName;
		return $this;
	}

	/**
	 * @param string $extensionKey
	 * @return MailTemplateService
	 */
	public function setExtensionKey($extensionKey) {
		$this->extensionKey = $extensionKey;
		return $this;
	}

	/**
	 * @param string $subject
	 * @return MailTemplateService
	 */
	public function setSubject($subject) {
		$this->subject = $subject;
		$this->mailMessage->setSubject($subject);
		return $this;
	}

	/**
	 * @param array $markers
	 * @return MailTemplateService
	 */
	public function setMarkers(array $markers) {
		$this->markers = $markers;
		return $this;
	}
}