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

namespace Vrh.OneReport
{
    /// <summary>
    /// A OneReport xml-ben a "General"-ben megadott helyen 
    /// a "Timout" elemet reprezentálja.
    /// </summary>
    public class TimeoutElement : XmlLinqBase
    {
        #region Constants
        /// <summary>
        /// AsyncPostBackTimout alapértelmezett értéke
        /// </summary>
        public const int DEFAULT_ASYNCPOSTBACK = 60;

        /// <summary>
        /// ExecutionTimout alapértelmezett értéke
        /// </summary>
        public const int DEFAULT_EXECUTION = 120;

        /// <summary>
        /// SQL Query Timout alapértelmezett értéke
        /// </summary>
        public const int DEFAULT_SQLQUERY = 60;
		#endregion Constants

		#region AttributeNames static class
		/// <summary>
		/// Az XML fájlban ilyen attribútum nevek találhatóak egy "general.Timout" elemben.
		/// </summary>
		public static class AttributeNames
        {
            /// <summary>
            /// 'AsyncPostBack' attribútum név.
            /// </summary>
            public const string ASYNCPOSTBACK = "AsyncPostBack";

            /// <summary>
            /// 'Execution' attribútum név.
            /// </summary>
            public const string EXECUTION = "Execution";

            /// <summary>
            /// 'SqlQuery' attribútum név.
            /// </summary>
            public const string SQLQUERY = "SqlQuery";

			/// <summary>
			/// 'AutoPurge' attributum név.
			/// </summary>
			public const string AUTOPURGE = "AutoPurge";
		}
		#endregion AttributeNames static class

		#region Properties

		/// <summary>
		/// AsyncPostBack timeout érték másodpercben. 
		/// Mennyi ideig várjon az akció az eredményére.
		/// Alapértelmezett értéke: 60
		/// </summary>
		public int AsyncPostBack { get; set; } = DEFAULT_ASYNCPOSTBACK;

        /// <summary>
        /// Http runtime execution timeout érték másodpercben)
        /// Alapértelmezett értéke: 120
        /// </summary>
        public int Execution { get; set; } = DEFAULT_EXECUTION;

        /// <summary>
        /// SQL query-k számára érvényes timeout érték másodpercben.
        /// Alapértelmezett értéke: 60
        /// </summary>
        public int SqlQuery { get; set; } = DEFAULT_SQLQUERY;
		#endregion Properties

		#region Constructors

		/// <summary>
		/// Alapértelmezett konstructor
		/// </summary>
		public TimeoutElement() 
		{
			this.AsyncPostBack = DEFAULT_ASYNCPOSTBACK;
			this.Execution = DEFAULT_EXECUTION;
			this.SqlQuery = DEFAULT_SQLQUERY;
		}

		/// <summary>
		/// Konstruktor az XElement feldolgozásával.
		/// </summary>
		/// <param name="xelement">Egy "Timeout" XElement.</param>
		/// <param name="defaultTimout">Az éppen érvényes alapértelmezés.</param>
		public TimeoutElement(XElement xelement, TimeoutElement defaultTimout = null)
        {
			if (defaultTimout == null) { defaultTimout = new TimeoutElement(); }
            if (xelement != null)
            {
                this.AsyncPostBack = GetValue(xelement.Attribute(AttributeNames.ASYNCPOSTBACK), defaultTimout.AsyncPostBack);
                this.Execution = GetValue(xelement.Attribute(AttributeNames.EXECUTION), defaultTimout.Execution);
                this.SqlQuery = GetValue(xelement.Attribute(AttributeNames.SQLQUERY), defaultTimout.SqlQuery);
			}
			else
            {
                this.AsyncPostBack = defaultTimout.AsyncPostBack;
                this.Execution = defaultTimout.Execution;
                this.SqlQuery = defaultTimout.SqlQuery;
            }
        }
        #endregion Constructors
    }
}
