using System;
using System.Collections.Generic;
using System.Configuration;
using System.Globalization;
using System.IO;
using System.Net;
using System.Net.Mail;
using System.Security.Cryptography;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml;
using BeWo.Data.Entities;
using BeWo.Service.ServiceContracts;
using BeWo.Data;

namespace BeWo.Service.Core
{
    public class Utils
    {
        public static FaultException<BeWoFault> CreateBeWoFaultException(Exception ex)
        {
            try
            {
                SendErrorMail("MYSQL EXCEPTION - AUTOMATED MAIL NOTIFICATION", ex.ToString());
            }
            catch
            {
            }

            return new FaultException<BeWoFault>(new BeWoFault(ex), ex.ToString());
        }

        public static string GetClientIP()
        {
	        if (OperationContext.Current != null)
	        {
		        MessageProperties properties = OperationContext.Current.IncomingMessageProperties;
		        var endpoint = properties[RemoteEndpointMessageProperty.Name] as RemoteEndpointMessageProperty;
		        return endpoint.Address;
	        }
	        return null;
        }

        public static string GetMD5(string val)
        {
            var lMD5 = new MD5CryptoServiceProvider();
            string lHash = BitConverter.ToString(lMD5.ComputeHash(Encoding.UTF8.GetBytes(val)));
            return lHash;
        }

        public static bool IsValidEmail(string email)
        {
            return Regex.IsMatch(email, @"^([\w-\.]+)@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.)|(([\w-]+\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\]?)$");
        }

        public static bool SendErrorMail(string subject, string body)
        {
            string sendMailSetting = ConfigurationManager.AppSettings.Get("SendMailOnError");
            bool sendMail = false;
            if (bool.TryParse(sendMailSetting, out sendMail))
            {
                if (sendMail)
					return SendMail(subject, body, ConfigurationManager.AppSettings.Get("Recipient"));
            }
            return false;
        }

		public static bool SendMail(string subject, string body, string toAddress)
        {
	        return SendMail(null, null, subject, body, toAddress);
        }

		public static bool SendMail(string senderName, string senderEMail, string subject, string body, string toAddress)
		{
			var server = ConfigurationManager.AppSettings.Get("SmptServer");
			var user = ConfigurationManager.AppSettings.Get("SmtpUser");
			var pass = ConfigurationManager.AppSettings.Get("SmtpPassword");
			String to = toAddress;
			if (String.IsNullOrEmpty(to))
				to = ConfigurationManager.AppSettings.Get("SupportEMail");
			if (String.IsNullOrEmpty(to))
				to = "support@bewoplaner.de";

			if (senderEMail == null)
				senderEMail = "bewoapp@bewoplaner.de";

			if (to.Equals("support@bewoplaner.de"))
			{
				var body2 = "Kunde: " + MultitenancyOperationContextExt.Current.Tenant;
				//body2 += "\r\nIP: " + GetClientIP();
				body += "\n\n" + body2;
			}

			return SendMail(senderEMail, senderName, to, subject, body, server, user, pass);

		}

        public static bool SendMail(string fromEMail, string fromName, string to, string subject, string body, string smtpServer, string smtpUser, string smtpPassword)
        {
            try
            {
				if (!IsValidEmail(to) || !IsValidEmail(fromEMail))
                {
                    return false;
                }

	            MailMessage message = null;
				if (String.IsNullOrEmpty(fromName))
					message = new MailMessage(fromEMail, to, subject, body);
				else
				{
					MailAddress fromMailAddress = new MailAddress(fromEMail, fromName);
					MailAddress toMailAddress = new MailAddress(to);

					message = new MailMessage(fromMailAddress, toMailAddress);
					message.Subject = subject;
					message.Body = body;
				}
				message.BodyEncoding = Encoding.UTF8;
	            message.IsBodyHtml = false;

                var mailClient = new SmtpClient(smtpServer, 587) { Credentials = new NetworkCredential(smtpUser, smtpPassword) };
	            mailClient.EnableSsl = true;
                mailClient.SendAsync(message, null);

                return true;
            }
            catch
            {
                return false;
            }
        }

        public static string[][] T(List<string> pSearchParameter, int pSearchFieldCount)
        {
            //List<string> lDifferentParameter;

            return null;
        }

		public static string GetRecurringAppointmentsId(SchedulerAppointment appointment)
		{
			var erg = string.Empty;

			if (appointment.RecurrenceInfo == null)
				return erg;

			using (var reader = XmlReader.Create(new StringReader(appointment.RecurrenceInfo)))
			{
				reader.ReadToFollowing("RecurrenceInfo");
				reader.MoveToAttribute("Id");
				erg = reader.Value;
			}

			return erg;
		}

		public static DateTime[] GetRecurrenceInterval(SchedulerAppointment appointment)
		{
			var erg = new DateTime[2];

			using (var reader = XmlReader.Create(new StringReader(appointment.RecurrenceInfo)))
			{
				reader.ReadToFollowing("RecurrenceInfo");

				reader.MoveToAttribute("Start");
				DateTime outValue;
				var parsingSuccessful = DateTime.TryParseExact(reader.Value, @"MM\/dd\/yyyy HH:mm:ss", null, DateTimeStyles.None, out outValue);
				erg[0] = outValue;
				reader.MoveToAttribute("End");
				parsingSuccessful = DateTime.TryParseExact(reader.Value, @"MM\/dd\/yyyy HH:mm:ss", null, DateTimeStyles.None, out outValue);
				erg[1] = outValue;
			}

			return erg;
		}
    }
}