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.iScheduler.Report 
{
    /// <summary>
    /// A csomagok szerkesztéséhez szükséges URL-ek és tulajdonságok gyűjtő helye.
    /// </summary>
    public class PackageEditorElement : XmlLinqBase
    {
        #region Built'in classes

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

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

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

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

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

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

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

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

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

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

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

        #region AttributeNames static class
        /// <summary>
        /// Az XML fájlban ilyen attribútum nevek találhatóak egy 'Button' elemben.
        /// </summary>
        private static class AttributeNames
        {
        }
        #endregion AttributeNames static class

        #endregion Built'in classes

        #region Properties

        /// <summary>
        /// Szerepnevek maszkja
        /// </summary>
        public string RoleNameMask { get; set; }

        /// <summary>
        /// Szerepkörök lekérdezéséhez az url
        /// </summary>
        public UrlElement RolegroupListUrl { get; set; }

        /// <summary>
        /// Felhasználók listáját visszaadó URL.
        /// </summary>
        public UrlElement UserListUrl { get; set; }

		/// <summary>
		/// Egy szerephez tartozó felhasználók listáját visszaadó URL.
		/// </summary>
		public UrlElement UserListOfRoleUrl { get; set; }

		/// <summary>
		/// Szerepet létrehozó URL.
		/// </summary>
		public UrlElement CreateRoleUrl { get; set; }

        /// <summary>
        /// Szerepet törlő URL.
        /// </summary>
        public UrlElement DeleteRoleUrl { get; set; }

        /// <summary>
        /// Szerep és szerepkör összerendelés.
        /// </summary>
        public UrlElement AssignRoleToRolegroupsUrl { get; set; }

        /// <summary>
        /// Szerep és felhasználó összerendelés
        /// </summary>
        public UrlElement AssignRoleToUsersUrl { get; set; }

        /// <summary>
        /// Riportok listáját eredményező URL.
        /// </summary>
        public UrlElement ReportListUrl { get; set; }

        /// <summary>
        /// Rerportok formátumát visszaadó URL.
        /// </summary>
        public UrlElement ReportFormatListUrl { get; set; }

        /// <summary>
        /// Az iSchedulerReport teszt futtatásához használt művelet kulcsa
        /// </summary>
        public string TestExecuteOperation { get; set; }

        #endregion Properties

        #region Constructors
        /// <summary>
        /// Példányosítás egy 'ObjectEditor' XElement alapján.
        /// </summary>
        /// <param name="xelement">Az 'ObjectEditor' elem XElement objektuma.</param>
        /// <exception cref="System.ApplicationException">
        /// Ha <paramref name="xelement"/> null, vagy valamelyik URL nem létezik.
        /// </exception>
        public PackageEditorElement(XElement xelement)
        {
            try
            {
                if (xelement == null)
                {
                    throw new ApplicationException(string.Format(Messages.ERR_MISSINGELEMENT, SchedulerReportXmlParser.ElementNames.PACKAGEDITOR));
                }

                this.RoleNameMask = GetValue(GetXElement(xelement, ElementNames.ROLENAMEMASK, true), "", true, true);
                this.RolegroupListUrl = new UrlElement(GetXElement(xelement, ElementNames.ROLEGROUPLISTURL, true));
                this.UserListUrl = new UrlElement(GetXElement(xelement, ElementNames.USERLISTURL, true));
				this.UserListOfRoleUrl = new UrlElement(GetXElement(xelement, ElementNames.USERLISTOFROLEURL, true));
				this.CreateRoleUrl = new UrlElement(GetXElement(xelement, ElementNames.CREATEROLEURL, true));

				this.DeleteRoleUrl = new UrlElement(GetXElement(xelement, ElementNames.DELETEROLEURL, true));
                this.AssignRoleToRolegroupsUrl = new UrlElement(GetXElement(xelement, ElementNames.ASSIGNROLETOROLEGROUPSURL, true));
                this.AssignRoleToUsersUrl = new UrlElement(GetXElement(xelement, ElementNames.ASSIGNROLETOUSERSURL, true));
                this.ReportListUrl = new UrlElement(GetXElement(xelement, ElementNames.REPORTLISTURL, true));
                this.ReportFormatListUrl = new UrlElement(GetXElement(xelement, ElementNames.REPORTFORMATLISTURL, true));
                this.TestExecuteOperation = GetValue(GetXElement(xelement, ElementNames.TESTEXECUTEOPERATION, true), SRConstants.Operations.EXECUTE_KEY);
				if (!SRGlobal.Operations.ContainsKey(this.TestExecuteOperation)) { this.TestExecuteOperation = SRConstants.Operations.EXECUTE_KEY; }
				
            }
            catch (Exception ex)
            {
                throw new ApplicationException(
                    $"Error occured when processing the \"{SchedulerReportXmlParser.ElementNames.PACKAGEDITOR}\" element!",
                    ex
                );
            }
        }
        #endregion Constructors
    }
}
