using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;

using VRH.Log4Pro.MultiLanguageManager;
using Vrh.XmlProcessing;

namespace Vrh.OneReport
{
    /// <summary>
    /// A 'General' elem leképezése az XML paraméterfájlból.
    /// Teljes XmlParser struktúra.
    /// </summary>
    public class GeneralXmlParser : XmlParser
    {
        #region Built'in classes

        #region ElementNames class
        /// <summary>
        /// Az XML fájlban ilyen elem nevek találhatóak egy "General" elemben.
        /// </summary>
        public new class ElementNames : XmlLinqBase.ElementNames
        {
			/// <summary>
			/// 'ConnectionString' elem név.
			/// </summary>
			public const string CONNECTIONSTRING = "ConnectionString";

            /// <summary>
            /// 'DefaultFolder' elem név.
            /// </summary>
            public const string DEFAULTFOLDER = "DefaultFolder";

            /// <summary>
            /// 'DefaultFormat' elem név.
            /// </summary>
            public const string DEFAULTFORMAT = "DefaultFormat";

            /// <summary>
            /// 'Timeout' elem név.
            /// </summary>
            public const string TIMEOUT = "Timeout";

			/// <summary>
			/// 'AutoPurge' elem név.
			/// </summary>
			public const string AUTOPURGE = "AutoPurge";

            /// <summary>
            /// 'Plugins' elem név.
            /// </summary>
            public const string PLUGINS= "Plugins";

            /// <summary>
            /// 'Plugin' elem név.
            /// </summary>
            public const string PLUGIN = "Plugin";
        }
        #endregion ElementNames class

        #endregion Built'in classes

        #region Properties

        #region ConnectionString property
        /// <summary>
        /// A "ConnectionString" elem értéke, ami az alapértelmezett
        /// kapcsolati sztrng nevét jelenti.
        /// Ha null vagy üres, akkor "" volt a beolvasáskorA Menu General elemében lévő property.
        /// </summary>
        public string ConnectionString
        {
            get
            {
                if (m_ConnectionString == null)
                {
                    m_ConnectionString = GetValue(
                        this.RootElement.Element(ElementNames.CONNECTIONSTRING), Constants.DEFAULT_CONNECTIONSTRING_NAME
                    );
                }
                return m_ConnectionString;
            }
        }
        private string m_ConnectionString = null;
		#endregion ConnectionString property

		#region DefaultFolder property   
		/// <summary>
		/// Az alapértelmezett mappák.
		/// </summary>
		public FolderElement DefaultFolder
        {
            get
            {
                if (m_DefaultFolder == null)
                {
                    m_DefaultFolder = new FolderElement(this.RootElement.Element(ElementNames.DEFAULTFOLDER));
                }
                return m_DefaultFolder;
            }
        }
        private FolderElement m_DefaultFolder = null;
		#endregion DefaultFolder property   


        
		#region DefaultFormat property
		/// <summary>
		/// Az alapértelmezett formátumok.
		/// </summary>
		public FormatElement DefaultFormat
        {
            get
            {
                if (m_DefaultFormat == null)
                {
                    m_DefaultFormat = new FormatElement(this.RootElement.Element(ElementNames.DEFAULTFORMAT));
                }
                return m_DefaultFormat;
            }
        }
        private FormatElement m_DefaultFormat = null;
        #endregion DefaultFormat property

        #region Timeout property
        /// <summary>
        /// A "Timout" objektum a "General" elemben.
        /// </summary>
        public TimeoutElement Timeout
        {
            get
            {
                if (m_Timeout == null)
                {
                    m_Timeout = new TimeoutElement(this.RootElement.Element(ElementNames.TIMEOUT));
                }
                return m_Timeout;
            }
        }
        private TimeoutElement m_Timeout = null;
		#endregion Timeout property

		#region AutoPurge property
		/// <summary>
		/// A "Timout" objektum a "General" elemben.
		/// </summary>
		public AutoPurgeElement AutoPurge
		{
			get
			{
				if (m_AutoPurge == null)
				{
					m_AutoPurge = new AutoPurgeElement(this.RootElement.Element(ElementNames.AUTOPURGE));
				}
				return m_AutoPurge;
			}
		}
		private AutoPurgeElement m_AutoPurge = null;
        #endregion AutoPurge property

        #region PluginList property
        /// <summary>
        /// Plugin típus esetén a tartalmazó dll teljes elérési útja
        /// </summary>
        public List<PluginDescriptor> PluginList
        {
            get
            {
                if (m_PluginList == null)
                {
                    var plxmllist = this.RootElement.Element(ElementNames.PLUGINS)?.Elements(ElementNames.PLUGIN);
                    if (plxmllist!=null && plxmllist.Any())
                    {
                        m_PluginList = new List<PluginDescriptor>();
                        foreach (XElement plxml in plxmllist) { m_PluginList.Add(new PluginDescriptor(plxml)); }
                    }
                }
                return m_PluginList;
            }
        }
        private List<PluginDescriptor> m_PluginList = null;

        #endregion DefaultPlugin property

        #endregion Properties

        #region Constructor
        /// <summary>
        /// A OneReport xml paraméter fájl "General" elemének feldolgozása.
        /// A "General" egy önálló XmlParser struktúra.
        /// </summary>
        /// <param name="xmlc">XmlParser kapcsolati objektum.</param>
        /// <param name="appPath">Az alkalmazás alap mappája. Ez alatt van az App_Path.</param>
        /// <param name="lcid">A környezetben érvényes nyelvi kód. Ha üres, akkor az XmlParser-ben beállított lesz érvényes.</param>
        /// <param name="otherVars">A környezetben az XmlParser részére létrehozott változók.</param>
        public GeneralXmlParser(
            XmlConnection xmlc,
            string appPath = null,
            string lcid = null,
            Dictionary<string, string> otherVars = null)
            : base(xmlc, appPath, lcid, otherVars)
        {
            try
            {
            }
            catch (Exception ex)
            {
                throw new ApplicationException($"Error in {nameof(GeneralXmlParser)} constructor!", ex);
            }
        }
        #endregion Constructor
    }
}
