/// <summary>
 /// This checks for valid completion code for all functions
 /// </summary>
 /// <param name="responseCompletionCode"></param>
 /// <returns></returns>
 public static bool CheckCompletionCode(Contracts.CompletionCode responseCompletionCode)
 {
     if (responseCompletionCode == Contracts.CompletionCode.Success)
     {
         return(true);
     }
     return(false);
 }
        /// <summary>
        /// Get power state of all blades
        /// </summary>
        /// <returns>Collection of Blade State response packets</returns>
        public GetAllPowerStateResponse GetAllPowerState()
        {
            byte MaxbladeCount = (byte)ConfigLoaded.Population;

            GetAllPowerStateResponse responses = new GetAllPowerStateResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.powerStateResponseCollection = new List<PowerStateResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[MaxbladeCount];
            uint bladeCount = MaxbladeCount;

            Tracer.WriteUserLog("Invoked GetAllPowerState()");
            Tracer.WriteInfo("Invoked GetAllPowerState()");

            for (int loop = 0; loop < bladeCount; loop++)
            {
                responses.powerStateResponseCollection.Add(GetPowerState(loop + 1));
                Tracer.WriteInfo("Blade power state: ", responses.powerStateResponseCollection[loop].powerState);

                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.powerStateResponseCollection[loop].completionCode;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Get All Blades PSU ALERT Default Power Cap
        /// </summary>
        public AllBladesPsuAlertDpcResponse GetAllBladesPsuAlertDefaultPowerCap()
        {
            AllBladesPsuAlertDpcResponse responses = new AllBladesPsuAlertDpcResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = String.Empty;
            responses.bladeDpcResponseCollection = new List<BladePsuAlertDpcResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[ConfigLoaded.Population];
            Tracer.WriteUserLog("Invoked GetAllBladesPsuAlertDefaultPowerCap");
            Tracer.WriteInfo("Received GetAllBladsePsuAlertDefaultPowerCap for all blades");

            for (int loop = 0; loop < ConfigLoaded.Population; loop++)
            {
                responses.bladeDpcResponseCollection.Add(GetBladePsuAlertDefaultPowerCap(loop + 1));
                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.bladeDpcResponseCollection[loop].completionCode;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Get power reading for all blades
        /// </summary>
        /// <returns>Array of blade responses containing the power reading</returns>
        public GetAllBladesPowerReadingResponse GetAllBladesPowerReading()
        {
            byte MaxbladeCount = (byte)ConfigLoaded.Population;
            GetAllBladesPowerReadingResponse responses = new GetAllBladesPowerReadingResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladePowerReadingCollection = new List<BladePowerReadingResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[MaxbladeCount];

            Tracer.WriteUserLog("Invoked GetAllBladesPowerReading()");

            try
            {
                for (int index = 0; index < ConfigLoaded.Population; index++)
                {
                    int bladeId = index + 1;
                    responses.bladePowerReadingCollection.Add(GetBladePowerReading((int)bladeId));

                    // Set the internal blade response to the blade completion code.
                    bladeInternalResponseCollection[index] = responses.bladePowerReadingCollection[index].completionCode;
                }
            }
            catch (Exception ex)
            {
                responses.completionCode = Contracts.CompletionCode.Failure;
                responses.statusDescription = responses.completionCode.ToString() + ": " + ex.Message;
                Tracer.WriteError("GetAllBladesPowerReading Exception" + ex);
                return responses;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Get information for all blades
        /// </summary>
        /// <returns>Array of blade info response</returns>
        public GetAllBladesInfoResponse GetAllBladesInfo()
        {
            byte maxbladeCount = (byte)ConfigLoaded.Population;

            Tracer.WriteInfo("Received GetAllBladesInfo()");
            Tracer.WriteUserLog("Invoked GetAllBladesInfo()");

            // Server side class structure to populate blade information
            GetAllBladesInfoResponse responses = new GetAllBladesInfoResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladeInfoResponseCollection = new List<BladeInfoResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[maxbladeCount];

            Tracer.WriteInfo("GetAllBladesInfo: Processing Blades ");

            // Loop to populate blade information for requested number of blades
            for (int loop = 0; loop < maxbladeCount; loop++)
            {
                int bladeId = loop + 1; // we need to get for all blades

                //Call getBladeInfo for the Blade ID
                responses.bladeInfoResponseCollection.Add(this.GetBladeInfo(bladeId));

                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.bladeInfoResponseCollection[loop].completionCode;

            }

            Tracer.WriteInfo("GetAllBladesInfo: Completed populating for Blades");

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;

            return responses;
        }
        /// <summary>
        /// Power On all blades
        /// </summary>
        /// <returns>Array of blade responses, one for each blade. Indicates success/failure.</returns>
        public AllBladesResponse SetAllPowerOn()
        {
            byte maxBladeCount = (byte)ConfigLoaded.Population;

            AllBladesResponse responses = new AllBladesResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladeResponseCollection = new List<BladeResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[maxBladeCount];

            Tracer.WriteInfo("Invoked SetAllPowerOn()");
            Tracer.WriteUserLog("Invoked SetAllPowerOn()");

            for (int loop = 0; loop < maxBladeCount; loop++)
            {
                int bladeId = loop + 1;
                responses.bladeResponseCollection.Add(SetPowerOn(bladeId));

                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.bladeResponseCollection[loop].completionCode;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Activate Deactivate PSU ALERT Action against all blades.
        /// </summary>
        public Contracts.AllBladesResponse SetAllBladesPsuAlert(bool enableProchot, int action, bool removeCap)
        {
            Contracts.AllBladesResponse responses = new Contracts.AllBladesResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = String.Empty;
            responses.bladeResponseCollection = new List<BladeResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[ConfigLoaded.Population];

            Tracer.WriteUserLog("Invoked SetAllBladesPsuAlert");
            Tracer.WriteInfo("Received SetAllBladesPsuAlert");

            for (int loop = 0; loop < ConfigLoaded.Population; loop++)
            {
                responses.bladeResponseCollection.Add(SetBladePsuAlert(loop + 1, enableProchot, action, removeCap));
                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.bladeResponseCollection[loop].completionCode;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Set all blades power limit to the given value
        /// </summary>
        /// <param name="powerLimitInWatts">Power limit to set</param>
        /// <returns>Array of blade responses indicating blade operation was success/failure</returns>
        public AllBladesResponse SetAllBladesPowerLimit(double powerLimitInWatts)
        {
            byte MaxbladeCount = (byte)ConfigLoaded.Population;

            AllBladesResponse responses = new AllBladesResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladeResponseCollection = new List<BladeResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[MaxbladeCount];

            Tracer.WriteUserLog("Invoked SetAllBladesPowerLimit(powerLimitInWatts: {0})", powerLimitInWatts);
            try
            {
                for (int index = 0; index < ConfigLoaded.Population; index++)
                {
                    responses.bladeResponseCollection.Add(SetBladePowerLimit((int)(index + 1), powerLimitInWatts));

                    // Set the internal blade response to the blade completion code.
                    bladeInternalResponseCollection[index] = responses.bladeResponseCollection[index].completionCode;
                }
            }
            catch (Exception ex)
            {
                responses.completionCode = Contracts.CompletionCode.Failure;
                responses.statusDescription = responses.completionCode.ToString() + ": " + ex.Message;
                Tracer.WriteError("SetAllBladesPowerLimit Exception" + ex.Message);
                return responses;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Set soft blade power limit ON for all blades
        /// </summary>
        /// <returns>Array of blade responses indicating blade operation was success/failure</returns>
        public AllBladesResponse SetAllBladesOn()
        {
            byte MaxbladeCount = (byte)ConfigLoaded.Population;

            AllBladesResponse responses = new AllBladesResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladeResponseCollection = new List<BladeResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[MaxbladeCount];

            Tracer.WriteInfo("Received SetAllBladesOn()");
            Tracer.WriteUserLog("Invoked SetAllBladesOn()");
            try
            {
                for (int index = 0; index < ConfigLoaded.Population; index++)
                {
                    int bladeId = index + 1;
                    responses.bladeResponseCollection.Add(SetBladeOn(bladeId));

                    // Set the internal blade response to the blade completion code.
                    bladeInternalResponseCollection[index] = responses.bladeResponseCollection[index].completionCode;
                }
            }
            catch (Exception ex)
            {
                Tracer.WriteError("SetAllBladesOn failed with exception" + ex);
                responses.completionCode = Contracts.CompletionCode.Failure;
                responses.statusDescription = Contracts.CompletionCode.Failure + ": " + ex.Message;
                return responses;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }
        /// <summary>
        /// Power cycle all blades
        /// </summary>
        /// <param name="offTime">time for which the blades will be powered off in seconds</param>
        /// <returns>Collection of Blade responses indicating if blade operation was success/failure</returns>
        public AllBladesResponse SetAllBladesActivePowerCycle(uint offTime)
        {
            byte maxbladeCount = (byte)ConfigLoaded.Population;

            AllBladesResponse responses = new AllBladesResponse();
            responses.completionCode = Contracts.CompletionCode.Unknown;
            responses.statusDescription = string.Empty;
            responses.bladeResponseCollection = new List<BladeResponse>();
            Contracts.CompletionCode[] bladeInternalResponseCollection = new Contracts.CompletionCode[maxbladeCount];

            Tracer.WriteUserLog(" Invoked SetAllBladesActivePowerCycle(offTime: {0})", offTime);

            // Check that the power off time is valid for a byte value since the IPMI command takes a byte value
            if (offTime > Byte.MaxValue)
            {
                Tracer.WriteWarning("SetAllBladesActivePowerCycle failed, Invalid power off time: {0}", offTime);

                responses.completionCode = Contracts.CompletionCode.ParameterOutOfRange;
                responses.statusDescription = Contracts.CompletionCode.ParameterOutOfRange.ToString();
                return responses;
            }

            for (int loop = 0; loop < maxbladeCount; loop++)
            {
                int bladeId = loop + 1;

                responses.bladeResponseCollection.Add(SetBladeActivePowerCycle(bladeId, offTime));

                // Set the internal blade response to the blade completion code.
                bladeInternalResponseCollection[loop] = responses.bladeResponseCollection[loop].completionCode;
            }

            Contracts.ChassisResponse varResponse = new Contracts.ChassisResponse();
            varResponse = ChassisManagerUtil.ValidateAllBladeResponse(bladeInternalResponseCollection);
            responses.completionCode = varResponse.completionCode;
            responses.statusDescription = varResponse.statusDescription;
            return responses;
        }