using System.Xml.Linq;

using VRH.Log4Pro.MultiLanguageManager;
using Vrh.XmlProcessing;
using System.Collections.Generic;
using System.Linq;

namespace Vrh.OneReport
{
    /// <summary>
    /// A "ReportDirectory.Report" elemet reprezentáló osztály.
    /// </summary>
    public class ReportListItem : XmlLinqBase
    {
        #region Built'in classes

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

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

            /// <summary>
            /// 'Name' attribútum név.
            /// </summary>
            public const string ID = "Id";

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

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

			/// <summary>
			/// Default value of UseCommonPresets attribute
			/// </summary>
			public const bool USECOMMONPRESETSDEFAULT = true;
		}
        #endregion AttributeNames static class

        #endregion Built'in classes

        #region Private variables

        /// <summary>
        /// A "ReportDirectory.Report" elemet jelentő XElement 
        /// objektum értéke, hogy a késleltetett feldolgozáshoz 
        /// elérhető legyen.
        /// </summary>
        private readonly XElement m_ReportXelement;

        /// <summary>
        /// A környezetben érvényes nyelvi kód.
        /// A késleltett feldolgozás miatt megőrzendő.
        /// </summary>
        private readonly string m_LCID;

		/// <summary>
		/// a commonpreset listát tartalmazza
		/// </summary>
		private readonly List<PresetElement> m_commonpresetlist;
		#endregion Private variables

		#region Properties

		/// <summary>
		/// A riport azonosítója.
		/// Kötelező!
		/// </summary>
		public string Id { get; private set; }

        /// <summary>
        /// A riport publikus megnevezése (leírása).
        /// </summary>
        public string DisplayName { get; private set; }

        /// <summary>
        /// Az adott riport lista elem, melyik nyelvekhez tartozik.
        /// Kötelező!
        /// </summary>
        public string LCIDList { get; private set; }

		/// <summary>
		/// Az adott riportban használni kell a General/CommonPresets részben definiált preset-eket
		/// </summary>
		public bool UseCommonPresets { get; private set; }

		#region Presets property
		/// <summary>
		/// A riporthoz tartozó alapértelmezett paraméter-értékek.
		/// Késleltetett feldolgozással, hogy ha csak a riport elnevezése kell, akkor
		/// ne töltsön időt a Preset-ek összeszedésével.
		/// Mindig van értéke, de lehet 0 tételszámmal, ha nincs Preset.
		/// </summary>
		public List<PresetElement> Presets
        {
            get
            {
                if (m_Presets == null )
                {
					m_Presets = PresetElement.PresetElementList(m_ReportXelement);
					if (this.UseCommonPresets) 
					{
						var presetkeylist = m_Presets.Select(x => x.Id);
						foreach (var pr in m_commonpresetlist) { if (!presetkeylist.Contains(pr.Id)) { m_Presets.Add(pr); } }
					};

					//m_Presets = new List<PresetElement>();
					//               if (m_Element != null)
					//               {
					//                   IEnumerable<XElement> presetsXE = m_Element.Elements(ElementNames.PRESET);
					//                   if (presetsXE != null && presetsXE.Any())
					//                   {
					//                       foreach (var presetXE in presetsXE)
					//                       {
					//                           this.Presets.Add(new PresetElement(presetXE));
					//                       }
					//                   }
					//               }
				}
				return m_Presets;
            }
        }
		private List<PresetElement> m_Presets = null;
		#endregion Presets property

		#endregion Properties

		#region Constructor
		/// <summary>
		/// Példány létrehozása egy XElement alapján.
		/// </summary>
		/// <param name="reportXelement">Egy "ReportDirectory.Report" elem.</param>
		/// <param name="lcid">A környezetben érvényes nyelvi kód.</param>
		/// <param name="commonpresetlist">A környezetben érvényes nyelvi kód.</param>
		public ReportListItem(XElement reportXelement, List<PresetElement> commonpresetlist, string lcid)
        {
            if (reportXelement != null)
            {
                // Értékek megőrzése a késleltett feldolgozás miatt.
                m_ReportXelement = reportXelement;
                m_LCID = lcid;
				m_commonpresetlist = commonpresetlist;

				this.Id = GetValue(AttributeNames.ID, reportXelement, "", true, true);

                this.DisplayName = GetValue(reportXelement.Attribute(AttributeNames.DISPLAYNAME), "");
                this.LCIDList = GetValue(AttributeNames.LCIDLIST, reportXelement, "*", false, false);
				this.UseCommonPresets = GetValue(AttributeNames.USECOMMONPRESETS, reportXelement, AttributeNames.USECOMMONPRESETSDEFAULT, false, false);
			}
        }
        #endregion Constructor
    }
}
