//------------------------------------------------------------------------------
// The contents of this file are subject to the nopCommerce Public License Version 1.0 ("License"); you may not use this file except in compliance with the License.
// You may obtain a copy of the License at  http://www.nopCommerce.com/License.aspx. 
// 
// Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. 
// See the License for the specific language governing rights and limitations under the License.
// 
// The Original Code is nopCommerce.
// The Initial Developer of the Original Code is NopSolutions.
// All Rights Reserved.
// 
// Contributor(s): _______. 
//------------------------------------------------------------------------------

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Mail;
using System.Text;
using System.Xml;
using NopSolutions.NopCommerce.Common.Audit;
using NopSolutions.NopCommerce.Common.Tasks;

namespace NopSolutions.NopCommerce.Common.Messages
{
    /// <summary>
    /// Represents a task for sending queued message 
    /// </summary>
    public class SendQueuedMessagesTask : ITask
    {
        private int _maxTries = 5;

        /// <summary>
        /// Executes a task
        /// </summary>
        /// <param name="node">Xml node that represents a task description</param>
        public void Execute(XmlNode node)
        {
            XmlAttribute attribute1 = node.Attributes["maxTries"];
            if (attribute1 != null && !String.IsNullOrEmpty(attribute1.Value))
            {
                this._maxTries = int.Parse(attribute1.Value);
            }

            QueuedEmailCollection queuedEmails = MessageManager.GetAllQueuedEmails(10000, true, _maxTries);
            foreach (QueuedEmail queuedEmail in queuedEmails)
            {
                List<string> bcc = new List<string>();
                foreach (string str1 in queuedEmail.Bcc.Split(new char[] { ';' },  StringSplitOptions.RemoveEmptyEntries))
                {
                    bcc.Add(str1);
                }
                List<string> cc = new List<string>();
                foreach (string str1 in queuedEmail.Cc.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries))
                {
                    cc.Add(str1);
                }

                try
                {
                    MessageManager.SendEmail(queuedEmail.Subject, queuedEmail.Body,
                       new MailAddress(queuedEmail.From, queuedEmail.FromName),
                       new MailAddress(queuedEmail.To, queuedEmail.ToName), bcc, cc);

                    MessageManager.UpdateQueuedEmail(queuedEmail.QueuedEmailID, queuedEmail.Priority,
                        queuedEmail.From, queuedEmail.FromName, queuedEmail.To, queuedEmail.ToName,
                        queuedEmail.Cc, queuedEmail.Bcc, queuedEmail.Subject, queuedEmail.Body,
                        queuedEmail.CreatedOn, ++queuedEmail.SendTries, DateTime.Now);
                }
                catch (Exception exc)
                {
                    MessageManager.UpdateQueuedEmail(queuedEmail.QueuedEmailID, queuedEmail.Priority,
                        queuedEmail.From, queuedEmail.FromName, queuedEmail.To, queuedEmail.ToName,
                        queuedEmail.Cc, queuedEmail.Bcc, queuedEmail.Subject, queuedEmail.Body,
                        queuedEmail.CreatedOn, ++queuedEmail.SendTries, queuedEmail.SentOn);

                    LogManager.InsertLog(LogTypeEnum.MailError, string.Format("Error sending e-mail. {0}", exc.Message), exc);
                }
            }
        }

    }
}
