using System.Threading.Tasks;
using DiplomovaPrace.Contracts.Security.ViewModels;
using DiplomovaPrace.Services.Infrastructure;
using Havit.Extensions.DependencyInjection.Abstractions;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Extensions.Options;
using SendGrid.Helpers.Mail;

namespace DiplomovaPrace.Services.Mailer
{
	[Service]
	public class MailerService : IMailerService
	{
		private readonly MailerConfiguration mailerConfiguration;
		private readonly IMailSenderService mailSenderService;
		private readonly UrlConfiguration urlConfiguration;

		public MailerService(IOptions<MailerConfiguration> mailerConfiguration, IMailSenderService mailSenderService, IOptions<UrlConfiguration> urlConfiguration)
		{
			this.mailerConfiguration = mailerConfiguration.Value;
			this.mailSenderService = mailSenderService;
			this.urlConfiguration = urlConfiguration.Value;
		}

		public async Task SendOrderConfirmationEmailAsync(string mailTo, string customerFullName, int orderID, decimal orderPrice)
		{
			string messageBody = $"Dobrý den, {(string.IsNullOrWhiteSpace(customerFullName) ? "" : customerFullName) + ','}<br>" +
				"předem děkujeme za Vaši důvěru a využití našich služeb.<br/><br/>" +
				$"Vaše objednávka s číslem {orderID} a celkovou cenou {orderPrice} Kč byla úspěšně vytvořena. " +
				"O jejím dalším zpracování Vás budeme informovat na tuto emailovou adresu.<br/><br/>" +
				"S přáním hezkého dne<br/>" +
				"VKS Rynárec";

			SendGridMessage message = new()
			{
				From = new EmailAddress(mailerConfiguration.EmailFrom, mailerConfiguration.EmailFromName),
				Subject = "Potvrzení objednávky",
				PlainTextContent = messageBody,
				HtmlContent = messageBody
			};

			//TODO: Po otestování vložit email adresu uživatele
			message.AddTo(mailTo);
			//message.AddTo("stefl.frantisek@gmail.com");

			await mailSenderService.SendEmailAsync(message).ConfigureAwait(false);
		}

		public async Task SendOrderPaymentInformationEmailAsync(string mailTo, string customerFullName, int orderID, decimal orderPrice)
		{
			string messageBody = $"Dobrý den, {(string.IsNullOrWhiteSpace(customerFullName) ? "" : customerFullName) + ','}<br>" +
				$"pro objednávku s číslem {orderID} o celkové ceně {orderPrice} Kč jste zvolili možnost platby bankovním převodem.<br/>" +
				$"Finanční částku, prosím, zašlete na bankovní účet uvedený níže.<br/><br/>" +
				"Číslo účtu: 123456789/5500 <br/>" +
				"Variabilní symbol: 19374652 <br/>" +
				$"Částka: {orderPrice} Kč <br/><br/>" +
				"UPOZORNĚNÍ: Pokud nedojde k uhrazení objednávky do 14 dnů od jejího založení, bude objednávka smazána! <br/>" +
				"S přáním hezkého dne <br/>" +
				"VKS Rynárec";

			SendGridMessage message = new()
			{
				From = new EmailAddress(mailerConfiguration.EmailFrom, mailerConfiguration.EmailFromName),
				Subject = "Platba objednávky",
				PlainTextContent = messageBody,
				HtmlContent = messageBody
			};

			//TODO: Po otestování vložit email adresu uživatele
			message.AddTo(mailTo);
			//message.AddTo("stefl.frantisek@gmail.com");

			await mailSenderService.SendEmailAsync(message).ConfigureAwait(false);
		}

		public async Task SendOrderRdyForPickEmailAsync(string mailTo, string customerFullName, int orderID)
		{
			string messageBody = $"Dobrý den,{(string.IsNullOrWhiteSpace(customerFullName) ? "" : $" {customerFullName},")}<br />" +
				$"Vaše objednávka s číslem {orderID} je připravena k odběru na naší prodejně na adrese: <strong>Rynárec 89</strong>.<br /><br />" +
				"Otevírací doba: <br />" +
				"<ul><li>Po: 08 - 15:30</ li ><li>Út: 08 - 15:30</li><li>St: 08 - 15:30</li><li>Čt: 08 - 15:30</li><li>Pá: 08 - 15:30</li></ul><br />" +
				"S přáním hezkého dne <br />" +
				"VKS Rynárec";

			SendGridMessage message = new()
			{
				From = new EmailAddress(mailerConfiguration.EmailFrom, mailerConfiguration.EmailFromName),
				Subject = "Informace o stavu objednávky",
				PlainTextContent = messageBody,
				HtmlContent = messageBody
			};

			//TODO: Po otestování vložit email adresu uživatele
			message.AddTo(mailTo);
			//message.AddTo("stefl.frantisek@gmail.com");

			await mailSenderService.SendEmailAsync(message).ConfigureAwait(false);
		}

		public async Task SendPasswordRecoveryEmailAsync(string mailTo, string customerFullName, byte[] token, string role)
		{
			string tokenString = WebEncoders.Base64UrlEncode(token);

			string url = Role.Admin.Equals(role) ? urlConfiguration.AdminUrl : urlConfiguration.CustomerUrl;
			string messageBody = $"Dobrý den, {(string.IsNullOrWhiteSpace(customerFullName) ? "" : customerFullName) + ','}<br>" +
				"nedávno jste zažádali o obnovení hesla. Pro obnovení vaše hesla kliknětě na odkaz níže.<br/><br/>" +
				$"<a href=\"{url}/passwordReset/{tokenString} \">OBNOVIT HESLO</a><br/><br/>" +
				"Pokud jste o obnovení hesla nezažádali, prosíme, ignorujte tento email. <br/><br/>" +
				"S přáním hezkého dne <br/>" +
				"VKS Rynárec";

			SendGridMessage message = new()
			{
				From = new EmailAddress(mailerConfiguration.EmailFrom, mailerConfiguration.EmailFromName),
				Subject = "Obnovení hesla",
				PlainTextContent = messageBody,
				HtmlContent = messageBody
			};

			//TODO: Změnit na email zadaný uživatelem!
			message.AddTo(mailTo);
			//message.AddTo("stefl.frantisek@gmail.com");

			await mailSenderService.SendEmailAsync(message).ConfigureAwait(false);
		}
	}
}
