using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Vrh.XmlProcessing;

namespace Vrh.OneMessage
{
    /// <summary>
    /// OneMessage üzenet kézbesítő komponens számára 
    /// szükséges paramétereket tartalmazza.
    /// !FIGYELEM: A név szerinti tulajdonságokat, nem a Parameters tulajdonságban kell átadni.
    /// </summary>
    /// <remarks>
    /// A Parameters gyűjtemény a OneMessage paraméter XML fájlban paraméterként
    /// megadott hivatkozások feloldására való.
    /// </remarks>
    public class OneMessageParameters
    {
        #region PROPERTIES
        /// <summary>
        /// OneMessage paraméterező XML fájl helyét meghatározó kapcsolati sztring.
        /// </summary>
        public string XmlConnectionString { get; set; }

        /// <summary>
        /// A relatív ("~") útvonal feloldásának mappája.
        /// Példányosítás után külön kell neki értéket adni.
        /// </summary>
        public string AppPath { get; set; }

        /// <summary>
        /// A paraméterező fájból melyik üzenetleíró alapján kell a kézbesítést megvalósítani.
        /// </summary>
        public string MessageId { get; set; }

        /// <summary>
        /// A paraméterező fájlban, ezt a nyelvű üzenetleírót kell alkalmazni.
        /// Ha üres, akkor az XmlParser nyelvi beállítása határozza meg.
        /// </summary>
        public string LCID { get; set; }

        /// <summary>
        /// A paraméterező fájlban megadott továbbítás leírók közül melyiket használja
        /// a kézbesítés végrehajtásához.
        /// </summary>        
        public string Delivery { get; set; }

        /// <summary>
        /// A paraméterező fájlban megadott címzettek felülírása.
        /// Ha ez a paraméter értéket tartalmaz, akkor ezen címzettek részére történik a kézbesítés.
        /// </summary>
        public string SendTo { get; set; }

        /// <summary>
        /// Kinek a nevében kell feladni az üzenetet.
        /// A paraméterező fájlban megadott feladók felülírása.
        /// Ha ebben van érték, akkor ez(ek) lesz(nek) a feladó(k).
        /// </summary>
        public string SendAs { get; set; }

		/// <summary>
		/// Az  e-mail serverre mutató kapcsolat leríró.
		/// A paraméterező fájlban megadott kapcsolat leíró felülírása.
		/// Ha ebben van érték, akkor ez lesz a kapcsolat leíró.
		/// </summary>
		public string ConnectionString{ get; set; }

		/// <summary>
		/// Másolatot kapó címzettek vesszővel (",") elválasztott listája.
		/// A paraméterező fájlban megadott másolatot kapók felülírása.
		/// Ha ebben van érték, akkor ezek a címzettek kapnak másolatot.
		/// </summary>
		public string SendCopyTo { get; set; }

        /// <summary>
        /// A paraméterező fájlban megadott csatolmányok felülírása.
        /// A csatolmányokat vesszővel (",") kell elválasztani egymástól.
        /// Ha ez a gyűjtemény tartalmaz csatolmányokat, akkor ezen csatolmányok lesznek a kézbesítendő
        /// üzenetben.
        /// </summary>
        public string Attachments { get; set; }

        /// <summary>
        /// A paraméterező fájlban megadott üzenet tárgyának felülírása.
        /// Ha ez a paraméter értéket tartalmaz, akkor ez lesz az üzenet tárgya.
        /// </summary>
        public string Subject { get; set; }

        /// <summary>
        /// A paraméterező fájlban megadott üzenet tartalom felülírása.
        /// Ha ez a paraméter értéket tartalmaz, akkor ez lesz az üzenet tartalma.
        /// </summary>
        public string MessageBody { get; set; }

        /// <summary>
        /// Egyéb paraméterek az XmlParser számára.
        /// </summary>
        public Dictionary<string, string> Parameters = new Dictionary<string, string>();

        #endregion PROPERTIES

        #region Constructors
        /// <summary>
        /// Alapértelmezett kontruktor.
        /// </summary>
        public OneMessageParameters() { }

        /// <summary>
        /// Példány létrehozása a két szótár alapján.
        /// </summary>
        /// <param name="apppath"></param>
        /// <param name="firstlist">Alap paraméterek szótára.</param>
        /// <param name="secondlist">Egyéb paramáterek szótára.</param>
        /// <exception cref="System.ApplicationException">
        /// Ha 
        /// </exception>
        public OneMessageParameters(List<KeyValuePair<string,string>> firstlist, List<KeyValuePair<string, string>> secondlist=null, string apppath="")
        {
            this.AppPath = apppath; if (string.IsNullOrEmpty(this.AppPath)) { this.AppPath = ""; }
            var EMPTYLIST = new List<KeyValuePair<string, string>>();
            var allparameters = (firstlist ?? EMPTYLIST).Concat(secondlist ?? EMPTYLIST);
            foreach (var item in allparameters) 
            {
                if (string.IsNullOrWhiteSpace(item.Key)) continue;
                var value = item.Value;
                switch (item.Key)
                {
                    case Constants.UParam.XML: this.XmlConnectionString = value; break;
                    case Constants.UParam.LCID: this.LCID = value; break;
                    case Constants.UParam.MSGID: this.MessageId = value; break;
                    case Constants.UParam.DELIVERY: this.Delivery = value; break;
                    case Constants.UParam.SENDAS: this.SendAs = value; break;
                    case Constants.UParam.CONNSTR: this.ConnectionString = value; break;
                    case Constants.UParam.SENDCOPYTO: this.SendCopyTo = value; break;
                    case Constants.UParam.SENDTO: this.SendTo = value; break;
                    case Constants.UParam.SUBJECT: this.Subject = value; break;
                    case Constants.UParam.MSGBODY: this.MessageBody = value; break;
                    case Constants.UParam.ATTACHMENTS: this.Attachments = value; break;
                    default: if (Parameters.ContainsKey(item.Key)) { this.Parameters[item.Key] = value; } else { Parameters.Add(item.Key, value); } break;
                }
            }
        }
        #endregion Constructors
    }
}
