/*
// Copyright (c) 2019 Intel 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 <boost/algorithm/string/join.hpp>
#include <me_to_redfish_hooks.hpp>
#include <phosphor-logging/log.hpp>
#include <string_view>

namespace intel_oem::ipmi::sel::redfish_hooks::me
{
namespace health_event
{
namespace smbus_failure
{

static bool messageHook(const SELData& selData, std::string& eventId,
                        std::vector<std::string>& args)
{
    static const boost::container::flat_map<uint8_t, std::string> smlink = {
        {0x01, "SmLink0/0B"},
        {0x02, "SmLink1"},
        {0x03, "SmLink2"},
        {0x04, "SmLink3"},
        {0x05, "SmLink4"}};

    const auto errorDetails = selData.eventData3;
    const auto faultySmlink = smlink.find(selData.eventData2);
    if (faultySmlink == smlink.end())
    {
        return false;
    }

    eventId = "MeSmbusLinkFailure";

    args.push_back(faultySmlink->second);
    args.push_back(utils::toHex(errorDetails));

    return true;
}
} // namespace smbus_failure

namespace fw_status
{
static const boost::container::flat_map<uint8_t, std::string>
    manufacturingError = {
        {0x00, "Generic error"},
        {0x01, "Wrong or missing VSCC table"},
        {0x02, "Wrong sensor scanning period in PIA"},
        {0x03, "Wrong device definition in PIA"},
        {0x04, "Reserved (Wrong SMART/CLST configuration)"},
        {0x05, "Intel ME FW configuration is inconsistent or out of range"},
        {0x06, "Reserved"},
        {0x07, "Intel ME FW configuration is corrupted"},
        {0x08, "SMLink0/0B misconfiguration"}};

static const boost::container::flat_map<uint8_t, std::string> peciOverDmiError =
    {{0x01, "DRAM Init Done HECI message not received by Intel ME before EOP"},
     {0x02, "System PCIe bus configuration not known or not valid on DID HECI "
            "message arrival to Intel ME"},
     {0x03, "PECI over DMI run-time failure"}};

static const boost::container::flat_map<uint8_t, std::string>
    mctpInterfaceError = {
        {0x01, "No DID HECI message received before EOP"},
        {0x02, "No MCTP_SET_BUS_OWNER HECI message received by Intel ME on EOP "
               "arrival "
               "to ME while MCTP stack is configured in Bus Owner Proxy mode"}};

static const boost::container::flat_map<uint8_t, std::string>
    unsupportedFeature = {{0x00, "Other Segment Defined Feature"},
                          {0x01, "Fast NM limiting"},
                          {0x02, "Volumetric Airflow and Outlet Temperature"},
                          {0x03, "CUPS"},
                          {0x04, "Thermal policies and Inlet Temperature"},
                          {0x05, "Platform limiting with MICs"},
                          {0x07, "Shared power supplies"},
                          {0x08, "MIC Proxy"},
                          {0x09, "Reset warning"},
                          {0x0A, "PMBus Proxy"},
                          {0x0B, "Always on"},
                          {0x0C, "IPMI Intel ME FW update"},
                          {0x0D, "MCTP bus owner"},
                          {0x0E, "MCTP bus owner proxy"},
                          {0x0F, "Dual BIOS"},
                          {0x10, "Battery less"}};

static const boost::container::flat_map<uint8_t, std::string> umaError = {
    {0x00, "UMA Read integrity error. Checksum of data read from UMA differs "
           "from expected one."},
    {0x01, "UMA Read/Write timeout. Timeout occurred during copying data "
           "from/to UMA."},
    {0x02,
     "UMA not granted. BIOS did not grant any UMA or DRAM INIT done message "
     "was not received from BIOS before EOP. Intel ME FW goes to recovery."},
    {0x03, "UMA size granted by BIOS differs from requested. ME FW goes to "
           "recovery."}};

static const boost::container::flat_map<uint8_t, std::string> pttHealthEvent = {
    {0x00, "Intel PTT disabled (PTT region is not present)."},
    {0x01, "Intel PTT downgrade (PTT data should be not available)."},
    {0x02, "Intel PTT disabled (battery less configuration)."}};

static const boost::container::flat_map<uint8_t, std::string>
    bootGuardHealthEvent = {
        {0x00, "Boot Guard flow error (possible reasons: verification timeout; "
               "verification error; BIOS Protection error)."}};

static const boost::container::flat_map<uint8_t, std::string> restrictedMode = {
    {0x01, "Firmware entered restricted mode – UMA is not available. "
           "Restricted features set."},
    {0x02, "Firmware exited restricted mode."}};

static const boost::container::flat_map<uint8_t, std::string>
    multiPchModeMisconfig = {
        {0x01, "BIOS did not set reset synchronization in multiPCH mode"},
        {0x02,
         "PMC indicates different non/legacy mode for the PCH than BMC set "
         "on the GPIO"},
        {0x03,
         "Misconfiguration MPCH support enabled due to BTG support enabled"}};

static const boost::container::flat_map<uint8_t, std::string>
    flashVerificationError = {
        {0x00, "OEM Public Key verification error"},
        {0x01, "Flash Descriptor Region Manifest verification error"},
        {0x02, "Soft Straps verification error"}};

namespace autoconfiguration
{

bool messageHook(const SELData& selData, std::string& eventId,
                 std::vector<std::string>& args)
{
    static const boost::container::flat_map<uint8_t, std::string> dcSource = {
        {0b00, "BMC"}, {0b01, "PSU"}, {0b10, "On-board power sensor"}};

    static const boost::container::flat_map<uint8_t, std::string>
        chassisSource = {{0b00, "BMC"},
                         {0b01, "PSU"},
                         {0b10, "On-board power sensor"},
                         {0b11, "Not supported"}};

    static const boost::container::flat_map<uint8_t, std::string>
        efficiencySource = {
            {0b00, "BMC"}, {0b01, "PSU"}, {0b11, "Not supported"}};

    static const boost::container::flat_map<uint8_t, std::string>
        unmanagedSource = {{0b00, "BMC"}, {0b01, "Estimated"}};

    static const boost::container::flat_map<uint8_t, std::string>
        failureReason = {{0b00, "BMC discovery failure"},
                         {0b01, "Insufficient factory configuration"},
                         {0b10, "Unknown sensor type"},
                         {0b11, "Other error encountered"}};

    auto succeeded = selData.eventData3 >> 7 & 0b1;
    if (succeeded)
    {
        eventId = "MeAutoConfigSuccess";

        auto dc = dcSource.find(selData.eventData3 >> 5 & 0b11);
        auto chassis = chassisSource.find(selData.eventData3 >> 3 & 0b11);
        auto efficiency = efficiencySource.find(selData.eventData3 >> 1 & 0b11);
        auto unmanaged = unmanagedSource.find(selData.eventData3 & 0b1);
        if (dc == dcSource.end() || chassis == chassisSource.end() ||
            efficiency == efficiencySource.end() ||
            unmanaged == unmanagedSource.end())
        {
            return false;
        }

        args.push_back(dc->second);
        args.push_back(chassis->second);
        args.push_back(efficiency->second);
        args.push_back(unmanaged->second);
    }
    else
    {
        eventId = "MeAutoConfigFailed";

        const auto it = failureReason.find(selData.eventData3 >> 5 & 0b11);
        if (it == failureReason.end())
        {
            return false;
        }

        args.push_back(it->second);
    }

    return true;
}
} // namespace autoconfiguration

namespace factory_reset
{
bool messageHook(const SELData& selData, std::string& eventId,
                 std::vector<std::string>& args)
{
    static const boost::container::flat_map<uint8_t, std::string>
        restoreToFactoryPreset = {
            {0x00,
             "Flash file system error detected. Automatic restore to factory "
             "presets has been triggered."},
            {0x01, "Automatic restore to factory presets has been completed."},
            {0x02,
             "Restore to factory presets triggered by “Force ME Recovery” "
             "IPMI command has been completed."},
            {0x03,
             "Restore to factory presets triggered by AC power cycle with "
             "Recovery jumper asserted has been completed."}};

    auto param = restoreToFactoryPreset.find(selData.eventData3);
    if (param == restoreToFactoryPreset.end())
    {
        return false;
    }

    if (selData.eventData3 == 0x00)
    {
        eventId = "MeFactoryResetError";
    }
    else
    {
        eventId = "MeFactoryRestore";
    }

    args.push_back(param->second);
    return true;
}
} // namespace factory_reset

namespace flash_state
{
bool messageHook(const SELData& selData, std::string& eventId,
                 std::vector<std::string>& args)
{
    static const boost::container::flat_map<uint8_t, std::string>
        flashStateInformation = {
            {0x00,
             "Flash partition table, recovery image or factory presets image "
             "corrupted"},
            {0x01, "Flash erase limit has been reached"},
            {0x02,
             "Flash write limit has been reached. Writing to flash has been "
             "disabled"},
            {0x03, "Writing to the flash has been enabled"}};

    auto param = flashStateInformation.find(selData.eventData3);
    if (param == flashStateInformation.end())
    {
        return false;
    }

    if (selData.eventData3 == 0x03)
    {
        eventId = "MeFlashStateInformationWritingEnabled";
    }
    else
    {
        eventId = "MeFlashStateInformation";
    }

    args.push_back(param->second);
    return true;
}
} // namespace flash_state

static bool messageHook(const SELData& selData, std::string& eventId,
                        std::vector<std::string>& args)
{
    static const boost::container::flat_map<
        uint8_t,
        std::pair<std::string, std::optional<std::variant<utils::ParserFunc,
                                                          utils::MessageMap>>>>
        eventMap = {
            {0x00, {"MeRecoveryGpioForced", {}}},
            {0x01, {"MeImageExecutionFailed", {}}},
            {0x02, {"MeFlashEraseError", {}}},
            {0x03, {{}, flash_state::messageHook}},
            {0x04, {"MeInternalError", {}}},
            {0x05, {"MeExceptionDuringShutdown", {}}},
            {0x06, {"MeDirectFlashUpdateRequested", {}}},
            {0x07, {"MeManufacturingError", manufacturingError}},
            {0x08, {{}, factory_reset::messageHook}},
            {0x09, {"MeFirmwareException", utils::logByteHex<2>}},
            {0x0A, {"MeFlashWearOutWarning", utils::logByteDec<2>}},
            {0x0D, {"MePeciOverDmiError", peciOverDmiError}},
            {0x0E, {"MeMctpInterfaceError", mctpInterfaceError}},
            {0x0F, {{}, autoconfiguration::messageHook}},
            {0x10, {"MeUnsupportedFeature", unsupportedFeature}},
            {0x12, {"MeCpuDebugCapabilityDisabled", {}}},
            {0x13, {"MeUmaError", umaError}},
            {0x16, {"MePttHealthEvent", pttHealthEvent}},
            {0x17, {"MeBootGuardHealthEvent", bootGuardHealthEvent}},
            {0x18, {"MeRestrictedMode", restrictedMode}},
            {0x19, {"MeMultiPchModeMisconfig", multiPchModeMisconfig}},
            {0x1A, {"MeFlashVerificationError", flashVerificationError}}};

    return utils::genericMessageHook(eventMap, selData, eventId, args);
}
} // namespace fw_status

static bool messageHook(const SELData& selData, std::string& eventId,
                        std::vector<std::string>& args)
{
    const HealthEventType healthEventType =
        static_cast<HealthEventType>(selData.offset);

    switch (healthEventType)
    {
        case HealthEventType::FirmwareStatus:
            return fw_status::messageHook(selData, eventId, args);
            break;

        case HealthEventType::SmbusLinkFailure:
            return smbus_failure::messageHook(selData, eventId, args);
            break;
    }

    return false;
}
} // namespace health_event

/**
 * @brief Main entry point for parsing ME IPMI Platform Events
 *
 * @brief selData - IPMI Platform Event structure
 * @brief ipmiRaw - the same event in raw binary form
 *
 * @returns true if event was successfully parsed and consumed
 */
bool messageHook(const SELData& selData, const std::string& ipmiRaw)
{
    const EventSensor meSensor = static_cast<EventSensor>(selData.sensorNum);
    std::string eventId;
    std::vector<std::string> args;

    switch (meSensor)
    {
        case EventSensor::MeFirmwareHealth:
            if (health_event::messageHook(selData, eventId, args))
            {
                utils::storeRedfishEvent(ipmiRaw, eventId, args);
                return true;
            }
            break;
    }

    return defaultMessageHook(ipmiRaw);
}
} // namespace intel_oem::ipmi::sel::redfish_hooks::me