/**
 * Copyright © 2021 IBM Corporation
 *
 * 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.
 */
#pragma once

#include "error_history.hpp"

#include <string>

namespace phosphor::power::regulators
{

/**
 * Redundant phase fault type.
 *
 * A voltage regulator is sometimes called a "phase controller" because it
 * controls one or more phases that perform the actual voltage regulation.
 *
 * A regulator may have redundant phases.  If a redundant phase fails, the
 * regulator will continue to provide the desired output voltage.  However, a
 * phase fault error should be logged warning the user that the regulator has
 * lost redundancy.
 */
enum class PhaseFaultType : unsigned char
{
    /**
     * N phase fault type.
     *
     * Regulator has lost all redundant phases.  The regulator is now at
     * redundancy level N.
     */
    n,

    /**
     * N+1 phase fault type.
     *
     * An "N+2" regulator has lost one redundant phase.  The regulator is now at
     * redundancy level "N+1".
     */
    n_plus_1
};

/**
 * Returns the ErrorType that corresponds to the specified PhaseFaultType.
 *
 * The ErrorType enum is used with the ErrorHistory class.
 *
 * @param type phase fault type
 * @return error type
 */
inline ErrorType toErrorType(PhaseFaultType type)
{
    ErrorType errorType{ErrorType::phaseFaultN};
    switch (type)
    {
        case PhaseFaultType::n:
            errorType = ErrorType::phaseFaultN;
            break;
        case PhaseFaultType::n_plus_1:
            errorType = ErrorType::phaseFaultNPlus1;
            break;
    }
    return errorType;
}

/**
 * Returns the name of the specified PhaseFaultType.
 *
 * @param type phase fault type
 * @return phase fault type name
 */
inline std::string toString(PhaseFaultType type)
{
    std::string name{};
    switch (type)
    {
        case PhaseFaultType::n:
            name = "n";
            break;
        case PhaseFaultType::n_plus_1:
            name = "n+1";
            break;
    }
    return name;
}

} // namespace phosphor::power::regulators