#include <analyzer/service_data.hpp>

namespace analyzer
{

//------------------------------------------------------------------------------

void ServiceData::calloutTarget(pdbg_target* i_target,
                                callout::Priority i_priority, bool i_guard)
{
    // Add the target to the callout list.
    addTargetCallout(i_target, i_priority, i_guard);

    // Add the callout FFDC.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Hardware Callout";
    ffdc["Target"]       = util::pdbg::getPhysDevPath(i_target);
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    ffdc["Guard"]        = i_guard;
    addCalloutFFDC(ffdc);
    setSrcSubsystem(getTargetSubsystem(i_target), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::calloutConnected(pdbg_target* i_rxTarget,
                                   const callout::BusType& i_busType,
                                   callout::Priority i_priority, bool i_guard)
{
    // Get the endpoint target for the transfer side of the bus.
    auto txTarget = util::pdbg::getConnectedTarget(i_rxTarget, i_busType);

    // Callout the TX endpoint.
    addTargetCallout(txTarget, i_priority, i_guard);

    // Add the callout FFDC.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Connected Callout";
    ffdc["Bus Type"]     = i_busType.getString();
    ffdc["RX Target"]    = util::pdbg::getPhysDevPath(i_rxTarget);
    ffdc["TX Target"]    = util::pdbg::getPhysDevPath(txTarget);
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    ffdc["Guard"]        = i_guard;
    addCalloutFFDC(ffdc);
    setSrcSubsystem(getTargetSubsystem(txTarget), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::calloutBus(pdbg_target* i_rxTarget,
                             const callout::BusType& i_busType,
                             callout::Priority i_priority, bool i_guard)
{
    // Get the endpoint target for the transfer side of the bus.
    auto txTarget = util::pdbg::getConnectedTarget(i_rxTarget, i_busType);

    // Callout the RX endpoint.
    addTargetCallout(i_rxTarget, i_priority, i_guard);

    // Callout the TX endpoint.
    addTargetCallout(txTarget, i_priority, i_guard);

    // Callout everything else in between.
    // TODO: For P10 (OMI bus and XBUS), the callout is simply the backplane.
    addBackplaneCallout(i_priority);

    // Add the callout FFDC.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Bus Callout";
    ffdc["Bus Type"]     = i_busType.getString();
    ffdc["RX Target"]    = util::pdbg::getPhysDevPath(i_rxTarget);
    ffdc["TX Target"]    = util::pdbg::getPhysDevPath(txTarget);
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    ffdc["Guard"]        = i_guard;
    addCalloutFFDC(ffdc);
    setSrcSubsystem(i_busType.getSrcSubsystem(), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::calloutClock(const callout::ClockType& i_clockType,
                               callout::Priority i_priority, bool)
{
    // Callout the clock target.
    // TODO: For P10, the callout is simply the backplane. Also, there are no
    //       clock targets in the device tree. So at the moment there is no
    //       guard support for clock targets.
    addBackplaneCallout(i_priority);

    // Add the callout FFDC.
    // TODO: Add the target and guard type if guard is ever supported.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Clock Callout";
    ffdc["Clock Type"]   = i_clockType.getString();
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    addCalloutFFDC(ffdc);
    setSrcSubsystem(i_clockType.getSrcSubsystem(), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::calloutProcedure(const callout::Procedure& i_procedure,
                                   callout::Priority i_priority)
{
    // Add the actual callout to the service data.
    nlohmann::json callout;
    callout["Procedure"] = i_procedure.getString();
    callout["Priority"]  = callout::getString(i_priority);
    addCallout(callout);

    // Add the callout FFDC.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Procedure Callout";
    ffdc["Procedure"]    = i_procedure.getString();
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    addCalloutFFDC(ffdc);
    setSrcSubsystem(i_procedure.getSrcSubsystem(), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::calloutPart(const callout::PartType& i_part,
                              callout::Priority i_priority)
{
    if (callout::PartType::PNOR == i_part)
    {
        // The PNOR is on the BMC card.
        // TODO: Will need to be modified if we ever support systems with more
        //       than one BMC.
        addTargetCallout(util::pdbg::getTrgt("/bmc0"), i_priority, false);
    }
    else
    {
        throw std::logic_error("Unsupported part type: " + i_part.getString());
    }

    // Add the callout FFDC.
    nlohmann::json ffdc;
    ffdc["Callout Type"] = "Part Callout";
    ffdc["Part Type"]    = i_part.getString();
    ffdc["Priority"]     = callout::getStringFFDC(i_priority);
    addCalloutFFDC(ffdc);
    setSrcSubsystem(i_part.getSrcSubsystem(), i_priority);
}

//------------------------------------------------------------------------------

void ServiceData::addCallout(const nlohmann::json& i_callout)
{
    // The new callout is either a hardware callout with a location code or a
    // procedure callout.

    std::string type{};
    if (i_callout.contains("LocationCode"))
    {
        type = "LocationCode";
    }
    else if (i_callout.contains("Procedure"))
    {
        type = "Procedure";
    }
    else
    {
        throw std::logic_error("Unsupported callout: " + i_callout.dump());
    }

    // A map to determine the priority order. All of the medium priorities,
    // including the medium group priorities, are all the same level.
    // clang-format off
    static const std::map<std::string, unsigned int> m = {
        {callout::getString(callout::Priority::HIGH),  3},
        {callout::getString(callout::Priority::MED),   2},
        {callout::getString(callout::Priority::MED_A), 2},
        {callout::getString(callout::Priority::MED_B), 2},
        {callout::getString(callout::Priority::MED_C), 2},
        {callout::getString(callout::Priority::LOW),   1},
    };
    // clang-format on

    // The new callout must contain a valid priority.
    assert(i_callout.contains("Priority") &&
           m.contains(i_callout.at("Priority")));

    bool addCallout = true;

    for (auto& c : iv_calloutList)
    {
        if (c.contains(type) && (c.at(type) == i_callout.at(type)))
        {
            // The new callout already exists. Don't add a new callout.
            addCallout = false;

            if (m.at(c.at("Priority")) < m.at(i_callout.at("Priority")))
            {
                // The new callout has a higher priority, update it.
                c["Priority"] = i_callout.at("Priority");
            }
        }
    }

    if (addCallout)
    {
        iv_calloutList.push_back(i_callout);
    }
}

//------------------------------------------------------------------------------

void ServiceData::addTargetCallout(pdbg_target* i_target,
                                   callout::Priority i_priority, bool i_guard)
{
    nlohmann::json callout;

    callout["LocationCode"] = util::pdbg::getLocationCode(i_target);
    callout["Priority"]     = callout::getString(i_priority);
    callout["Deconfigured"] = false;
    callout["Guarded"]      = false; // default

    // Check if guard info should be added.
    if (i_guard)
    {
        auto guardType = queryGuardPolicy();

        if (!(callout::GuardType::NONE == guardType))
        {
            callout["Guarded"]    = true;
            callout["EntityPath"] = util::pdbg::getPhysBinPath(i_target);
            callout["GuardType"]  = guardType.getString();
        }
    }

    addCallout(callout);
}

//------------------------------------------------------------------------------

void ServiceData::addBackplaneCallout(callout::Priority i_priority)
{
    // TODO: There isn't a device tree object for this. So will need to hardcode
    //       the location code for now. In the future, we will need a mechanism
    //       to make this data driven.

    nlohmann::json callout;

    callout["LocationCode"] = "P0";
    callout["Priority"]     = callout::getString(i_priority);
    callout["Deconfigured"] = false;
    callout["Guarded"]      = false;

    addCallout(callout);
}

//------------------------------------------------------------------------------

void ServiceData::setSrcSubsystem(callout::SrcSubsystem i_subsystem,
                                  callout::Priority i_priority)
{
    // clang-format off
    static const std::map<callout::Priority, unsigned int> m =
    {
        // Note that all medium priorities, including groups A, B, and C, are
        // the same priority.
        {callout::Priority::HIGH,  3},
        {callout::Priority::MED,   2},
        {callout::Priority::MED_A, 2},
        {callout::Priority::MED_B, 2},
        {callout::Priority::MED_C, 2},
        {callout::Priority::LOW,   1},
    };
    // clang-format on

    // The default subsystem is CEC_HARDWARE with LOW priority. Change the
    // subsystem if the given subsystem has a higher priority or if the stored
    // subsystem is still the default.
    if (m.at(iv_srcSubsystem.second) < m.at(i_priority) ||
        (callout::SrcSubsystem::CEC_HARDWARE == iv_srcSubsystem.first &&
         callout::Priority::LOW == iv_srcSubsystem.second))
    {
        iv_srcSubsystem.first  = i_subsystem;
        iv_srcSubsystem.second = i_priority;
    }
}

//------------------------------------------------------------------------------

callout::SrcSubsystem ServiceData::getTargetSubsystem(pdbg_target* i_target)
{
    using TargetType_t = util::pdbg::TargetType_t;

    // Default the subsystem to CEC_HARDWARE
    callout::SrcSubsystem o_subSys = callout::SrcSubsystem::CEC_HARDWARE;

    // clang-format off
    static const std::map<uint8_t, callout::SrcSubsystem> subSysMap =
    {
        {TargetType_t::TYPE_DIMM,     callout::SrcSubsystem::MEMORY_DIMM   },
        {TargetType_t::TYPE_PROC,     callout::SrcSubsystem::PROCESSOR_FRU },
        {TargetType_t::TYPE_CORE,     callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_NX,       callout::SrcSubsystem::PROCESSOR     },
        {TargetType_t::TYPE_EQ,       callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_PEC,      callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_PHB,      callout::SrcSubsystem::PHB           },
        {TargetType_t::TYPE_MC,       callout::SrcSubsystem::MEMORY_CTLR   },
        {TargetType_t::TYPE_IOLINK,   callout::SrcSubsystem::PROCESSOR_BUS },
        {TargetType_t::TYPE_OMI,      callout::SrcSubsystem::MEMORY_CTLR   },
        {TargetType_t::TYPE_MCC,      callout::SrcSubsystem::MEMORY_CTLR   },
        {TargetType_t::TYPE_OMIC,     callout::SrcSubsystem::MEMORY_CTLR   },
        {TargetType_t::TYPE_OCMB,     callout::SrcSubsystem::MEMORY_FRU    },
        {TargetType_t::TYPE_MEM_PORT, callout::SrcSubsystem::MEMORY_CTLR   },
        {TargetType_t::TYPE_NMMU,     callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_PAU,      callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_IOHS,     callout::SrcSubsystem::PROCESSOR_UNIT},
        {TargetType_t::TYPE_PAUC,     callout::SrcSubsystem::PROCESSOR_UNIT},
    };
    // clang-format on

    auto targetType = util::pdbg::getTrgtType(i_target);

    // If the type of the input target exists in the map, update the output
    if (subSysMap.count(targetType) > 0)
    {
        o_subSys = subSysMap.at(targetType);
    }

    return o_subSys;
}

//------------------------------------------------------------------------------

} // namespace analyzer
