//* ============================================================================
//Copyright 2014 Hewlett Packard

//Licensed under the Apache License, Version 2.0 (the "License");
//you may not use this file except in compliance with the License.
//You may obtain a copy of the License at

//    http://www.apache.org/licenses/LICENSE-2.0

//Unless required by applicable law or agreed to in writing, software
//distributed under the License is distributed on an "AS IS" BASIS,
//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//See the License for the specific language governing permissions and
//limitations under the License.
//============================================================================ */
using System.Management.Automation;
using System.Xml.Linq;
using System.Collections.Generic;
using OpenStack.Client.Powershell.Utility;
using System.Xml.XPath;

namespace OpenStack.Client.Powershell.Cmdlets.Common
{
    [Cmdlet(VerbsCommon.New, "SP", SupportsShouldProcess = true)]
    //[RequiredServiceIdentifierAttribute(OpenStack.Objects.Domain.Admin.Services.ObjectStorage)]
    public class NewServiceProvidersCmdlet : BasePSCmdlet
    {

        private string _name = "";
        private bool _isDefault = false;
        private string _authenticationServiceURI = "";
        private string _username = "";
        private string _password = "";
        private string _defTenantId = "";
        
        #region Parameters

        [Parameter(Position = 0, ParameterSetName = "NewSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("n")]
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
        [Parameter(Position = 1, ParameterSetName = "NewSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("url")]
        public string AuthenticationServiceURI
        {
            get { return _authenticationServiceURI; }
            set { _authenticationServiceURI = value; }
        }
        [Parameter(Position = 2, ParameterSetName = "NewSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("un")]
        public string Username
        {
            get { return _username; }
            set { _username = value; }
        }
        [Parameter(Position = 3, ParameterSetName = "NewSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("p")]
        public string Password
        {
            get { return _password; }
            set { _password = value; }
        }
        [Parameter(Position = 4, ParameterSetName = "NewSP", Mandatory = true, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("t")]
        public string DefTenantId
        {
            get { return _defTenantId; }
            set { _defTenantId = value; }
        }
        [Parameter(Position = 4, ParameterSetName = "NewSP", Mandatory = false, ValueFromPipelineByPropertyName = true, HelpMessage = " ")]
        [Alias("d")]
        [ValidateNotNullOrEmpty]
        public SwitchParameter IsDefault
        {
            get { return _isDefault; }
            set { _isDefault = value; }
        }

        #endregion
        #region Methods
//=========================================================================================
/// <summary>
/// 
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
//=========================================================================================
        private XElement CreateAddElement(string name, string value)
        {
            XElement element = new XElement("add");
            element.SetAttributeValue("key", name);
            element.SetAttributeValue("value", value);
            return element;
        }
//=========================================================================================
/// <summary>
/// 
/// </summary>
//=========================================================================================
        protected override void ProcessRecord()
        {
            string isDef = "False";
            if (IsDefault) {
                isDef = "True";                
            }
            else {
                isDef = "False";
            }

            List<ServiceProvider> serviceProviders = new List<ServiceProvider>();
            XDocument doc                          = XDocument.Load(this.ConfigFilePath);
            XElement element                       = new XElement("ServiceProvider", new XAttribute("name", this.Name), new XAttribute("isDefault", isDef));

            element.Add(this.CreateAddElement("AuthenticationServiceURI", this.AuthenticationServiceURI));
            element.Add(this.CreateAddElement("Username", this.Username));
            element.Add(this.CreateAddElement("Password", this.Password));
            element.Add(this.CreateAddElement("DefaultTenantId", this.DefTenantId));

            doc.XPathSelectElement("configuration/appSettings/IdentityServices").Add(element);
            doc.Save(this.ConfigFilePath);
            this.WriteObject("");
            this.WriteObject("New Serviced Provider " + this.Name + " created!");
            this.WriteObject("");
        }
        #endregion
    }
}