/**
 * Copyright © 2019 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.
 */
#include "severity.hpp"

namespace openpower
{
namespace pels
{

using LogSeverity = phosphor::logging::Entry::Level;

namespace
{

LogSeverity convertPELSeverityToOBMC(SeverityType pelSeverity)
{
    LogSeverity logSeverity = LogSeverity::Error;

    const std::map<SeverityType, LogSeverity> severities{
        {SeverityType::nonError, LogSeverity::Informational},
        {SeverityType::recovered, LogSeverity::Informational},
        {SeverityType::predictive, LogSeverity::Warning},
        {SeverityType::unrecoverable, LogSeverity::Error},
        {SeverityType::critical, LogSeverity::Critical},
        {SeverityType::diagnostic, LogSeverity::Error},
        {SeverityType::symptom, LogSeverity::Warning}};

    auto s = severities.find(pelSeverity);
    if (s != severities.end())
    {
        logSeverity = s->second;
    }

    return logSeverity;
}

} // namespace

uint8_t convertOBMCSeverityToPEL(LogSeverity severity)
{
    uint8_t pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
    switch (severity)
    {
        case (LogSeverity::Notice):
        case (LogSeverity::Informational):
        case (LogSeverity::Debug):
            pelSeverity = static_cast<uint8_t>(SeverityType::nonError);
            break;

        case (LogSeverity::Warning):
            pelSeverity = static_cast<uint8_t>(SeverityType::predictive);
            break;

        case (LogSeverity::Critical):
            pelSeverity = static_cast<uint8_t>(SeverityType::critical);
            break;

        case (LogSeverity::Emergency):
        case (LogSeverity::Alert):
        case (LogSeverity::Error):
            pelSeverity = static_cast<uint8_t>(SeverityType::unrecoverable);
            break;
    }

    return pelSeverity;
}

std::optional<LogSeverity> fixupLogSeverity(LogSeverity obmcSeverity,
                                            SeverityType pelSeverity)
{
    bool isNonErrPelSev = (pelSeverity == SeverityType::nonError) ||
                          (pelSeverity == SeverityType::recovered);

    bool isNonErrObmcSev = (obmcSeverity == LogSeverity::Notice) ||
                           (obmcSeverity == LogSeverity::Informational) ||
                           (obmcSeverity == LogSeverity::Debug);

    // If a nonError/recovered PEL, then the LogSeverity must be
    // Notice/Informational/Debug, otherwise set it to Informational.
    if (isNonErrPelSev && !isNonErrObmcSev)
    {
        return LogSeverity::Informational;
    }

    // If a Notice/Informational/Debug LogSeverity, then the PEL
    // severity must be nonError/recovered, otherwise set it
    // to an appropriate value based on the actual PEL severity.
    if (isNonErrObmcSev && !isNonErrPelSev)
    {
        return convertPELSeverityToOBMC(pelSeverity);
    }

    // If PEL is critical, the LogSeverity should be as well.
    if ((obmcSeverity != LogSeverity::Critical) &&
        (pelSeverity == SeverityType::critical))
    {
        return LogSeverity::Critical;
    }

    return std::nullopt;
}

} // namespace pels
} // namespace openpower
