<?php
/** 
 * @package     VikBooking
 * @subpackage  core
 * @author      E4J s.r.l.
 * @copyright   Copyright (C) 2021 E4J s.r.l. All Rights Reserved.
 * @license     http://www.gnu.org/licenses/gpl-2.0.html GNU/GPL
 * @link        https://vikwp.com
 */

// No direct access
defined('ABSPATH') or die('No script kiddies please!');

/**
 * Implements the mailer interface for the Joomla platform.
 * 
 * @since 1.15
 */
class VBOPlatformOrgJoomlaMailer implements VBOPlatformMailerInterface
{
	/**
	 * Sends an e-mail through the pre-installed mailing system.
	 * 
	 * @param 	VBOMailWrapper  $mail  The e-mail encapsulation.
	 * 
	 * @return 	boolean         True on success, false otherwise.
	 */
	public function send(VBOMailWrapper $mail)
	{
		// sends through PHP mailer
		$service = new VBOMailServicePhpmailer();

		// prepare email content
		$this->prepare($mail);

		// send the e-mail
		return $service->send($mail);
	}

	/**
	 * Prepares the email content for the current platform.
	 * 
	 * @since 	1.15.2 (J) - 1.5.5 (WP)
	 */
	public function prepare(VBOMailWrapper $mail)
	{
		/**
		 * Trigger event to allow third party plugins to overwrite any property of the mail message.
		 * 
		 * @since 	1.18.2 (J) - 1.8.2 (WP)
		 */
		VBOFactory::getPlatform()->getDispatcher()->trigger('onBeforeSendMail', [$mail]);

		// init table content
		$content = JTable::getInstance('content');
		$content->text = VBOMailParser::checkWrapperSymbols($mail->getContent());

		// parse conditional text rules (properties should be set by who calls this method)
		$mail_content = $content->text;
		VikBooking::getConditionalRulesInstance()->parseTokens($mail_content);
		$content->text = $mail_content;

		// init params array
		$params = [];

		// import content plugins
		JPluginHelper::importPlugin('content');
		
		$app = JFactory::getApplication();

		/**
		 * This is the first stage in preparing content for output and is the
		 * most common point for content orientated plugins to do their work.
		 * Since the article and related parameters are passed by reference,
		 * event handlers can modify them prior to display.
		 *
		 * @param 	string   $context   The context of the content being
		 * 								passed to the plugin.
		 * @param 	JTable   &$article  A reference to the article that is
		 * 								being rendered by the view.
		 * @param 	mixed    &$params   A reference to an associative array 
		 * 								of relevant parameters.
		 * @param 	integer  $page      An integer that determines the "page"
		 * 								of the content that is to be generated.
		 *
		 * @return 	void
		 *
		 * @since 	1.5
		 */
		$app->triggerEvent('onContentPrepare', array('com_vikbooking', &$content, &$params, 0));

		// update e-mail contents
		$mail->setContent($content->text);

		// return the prepared email content
		return $content->text;
	}
}
