///* ============================================================================
//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;
//using System.Management.Automation;
//using System.Collections.ObjectModel;
//using OpenStack.Client.Powershell.Providers.Storage;
//using System.Collections.Generic;
//using OpenStack;

//namespace OpenStack.Client.Powershell.Cmdlets.Common
//{  
//    public class BaseAuthenticationCmdlet : BasePSCmdlet
//    {
//        private string _key;
//        private string _value;
//        private SwitchParameter _reset = false;
////==================================================================================================
///// <summary>
///// 
///// </summary>
////==================================================================================================
//        protected void InitializeSession(AuthenticationRequest request, Settings settings = null)
//        {
//            Context context  = new Context();         

//            if (request != null)
//            {
//                KeystoneAuthProvider authProvider = new KeystoneAuthProvider();
//                AuthenticationResponse response   = authProvider.Authenticate(request);

//                context.ServiceCatalog = response.ServiceCatalog;
//                if (settings == null)
//                    context.Settings = Settings.Default;
//                else
//                    context.Settings = settings;
//                context.AccessToken    = response.Token;

//                this.SessionState.PSVariable.Set(new PSVariable("Context", context));
//                this.SessionState.PSVariable.Set(new PSVariable("BaseRepositoryFactory", new BaseRepositoryFactory(context)));
//            }
//        }
////==================================================================================================
///// <summary>
///// 
///// </summary>
////==================================================================================================
//        protected void InitializeSession(Settings settings)
//        {
//            AuthenticationRequest request = new AuthenticationRequest(new Credentials(settings.Username, settings.Password), settings.DefaultTenantId);
//            this.InitializeSession(request, settings);            
//        }
////==================================================================================================
///// <summary>
///// 
///// </summary>
///// <returns></returns>
////==================================================================================================
//        private System.Collections.ObjectModel.Collection<PSDriveInfo> GetAvailableDrives(Settings settings, ProviderInfo providerInfo, string configFilePath)
//        {
//            List<StorageContainer> storageContainers = null;
//            OSDriveParameters parameters           = new OSDriveParameters();

//            if (this.Settings != null)
//            {
//                parameters.Settings = this.Settings;
//            }
//            else
//            {
//                parameters.Settings = settings;
//            }

//            try
//            {
//                IContainerRepository storageContainerRepository = this.RepositoryFactory.CreateContainerRepository();
//                storageContainers                               = storageContainerRepository.GetStorageContainers(configFilePath);
//            }
//            catch (Exception ex)
//            {
//                Console.WriteLine(ex);
//            }

//            Collection<PSDriveInfo> drives = new Collection<PSDriveInfo>();

//            // For every storageContainer that the User has access to, create a Drive that he can mount within Powershell..

//            try
//            {
//                if (storageContainers.Count > 0)
//                {
//                    foreach (StorageContainer storageContainer in storageContainers)
//                    {
//                        PSDriveInfo driveInfo      = new PSDriveInfo(storageContainer.Name, providerInfo, "/", "Root folder for your storageContainer", null);
//                        OSDriveInfo kvsDriveInfo = new OSDriveInfo(driveInfo, parameters, this.Context);
//                        try
//                        {
//                            drives.Add(kvsDriveInfo);
//                        }
//                        catch (Exception) { }
//                    }
//                }
//                else
//                {
//                    PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
//                    return new Collection<PSDriveInfo>   
//                        {   
//                        new OSDriveInfo(driveInfo, parameters, this.Context)   
//                        };
//                }
//            }
//            catch (Exception)
//            {

//            }

//            return drives;
//        }
////=======================================================================================================
///// <summary>
///// Removes all currently registered drives..
///// </summary>
////=======================================================================================================
//        private void RemoveDrives()
//        {
//            // Remove the old Users drives first..

//            Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("OS-Storage");
//            foreach (PSDriveInfo deadDrive in deadDrives)
//            {
//                this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
//            }
//        }
//////=======================================================================================================
/////// <summary>
/////// removes only the currently registered shared drives..
/////// </summary>
//////=======================================================================================================
////        private void RemoveSharedDrives()
////        {
////            Collection<PSDriveInfo> deadDrives = this.SessionState.Drive.GetAllForProvider("OS-Storage");
////            foreach (OSDriveInfo deadDrive in deadDrives)
////            {
////                if (deadDrive.SharePath != null)
////                   this.SessionState.Drive.Remove(deadDrive.Name, true, "local");
////            }
////        }      
////=======================================================================================================
///// <summary>
///// 
///// </summary>
////=======================================================================================================
//        protected void WriteContainers(string configFilePath)
//        {
//            List<string> invalidDriveNames = new List<string>();
//            OSDriveParameters parameters = new OSDriveParameters();

//            // Write out the commands header information first..

//            WriteObject("");
//            Console.ForegroundColor = ConsoleColor.DarkGray;
//            WriteObject("===================================================================");
//            Console.ForegroundColor = ConsoleColor.Yellow;
//            WriteObject("Object Storage Service available. Remapping to the following drives.");
//            Console.ForegroundColor = ConsoleColor.DarkGray;
//            WriteObject("===================================================================");
//            Console.ForegroundColor = ConsoleColor.Green;
//            WriteObject(" ");

//            HPOSNavigationProvider provider = new HPOSNavigationProvider();
//            Collection<PSDriveInfo> drives = this.GetAvailableDrives(this.Settings, this.SessionState.Provider.GetOne("OS-Storage"), configFilePath);

//            if (drives != null)
//            {
//                this.RemoveDrives();

//                foreach (PSDriveInfo drive in drives)
//                {
//                    if (drive.Name != string.Empty)
//                    {
//                        WriteObject("Storage Container : [" + drive.Name + "] now available.");
//                    }

//                    try
//                    {
//                        this.SessionState.Drive.New(drive, "local");
//                    }
//                    catch (PSArgumentException ex)
//                    {
//                        if (drive.Name != string.Empty)
//                            invalidDriveNames.Add(drive.Name);
//                    }
//                    catch (Exception) { }

//                }
//                WriteObject("");
//            }
//            else
//            {
//                // No storageContainers exist for the new credentials so make some up...

//                PSDriveInfo driveInfo = new PSDriveInfo("OS-Init", this.SessionState.Drive.Current.Provider, "/", "Root folder for your storageContainer", null);
//                this.SessionState.Drive.New(new OSDriveInfo(driveInfo, parameters, this.Context), "local");
//            }

//            if (invalidDriveNames.Count > 0)
//            {
//                WriteObject("");
//                Console.ForegroundColor = ConsoleColor.DarkGray;
//                WriteObject("=================================================================");
//                Console.ForegroundColor = ConsoleColor.Red;
//                WriteObject("Error : A subset of your Containers could not be bound to this");
//                WriteObject("session due to naming conflicts with the naming standards required");
//                WriteObject("for Powershell drives. These containers are listed below.");
//                Console.ForegroundColor = ConsoleColor.DarkGray;
//                WriteObject("=================================================================");
//                Console.ForegroundColor = ConsoleColor.Green;
//                WriteObject(" ");

//                foreach (string name in invalidDriveNames)
//                {
//                    WriteObject(name);
//                    WriteObject(" ");
//                }
//                WriteObject(" ");
//            }
//        }
////=======================================================================================================
///// <summary>
///// 
///// </summary>
////=======================================================================================================
//        protected void WriteServices()
//        {
//            WriteObject("");
//            Console.ForegroundColor = ConsoleColor.DarkGray;
//            WriteObject("=================================================================");
//            Console.ForegroundColor = ConsoleColor.Yellow;
//            WriteObject("Binding to new Account. New service catalog is as follows.");
//            Console.ForegroundColor = ConsoleColor.DarkGray;
//            WriteObject("=================================================================");
//            Console.ForegroundColor = ConsoleColor.Green;
//            WriteObject(" ");

//            foreach (Service service in this.Context.ServiceCatalog)
//            {
//                WriteObject(service);
//            }
//            WriteObject("");
//        }  
//    }
//}