#pragma once

#include <map>
#include <string>

namespace analyzer
{

namespace callout
{

/** @brief All callouts will have a priority indicating when to issue the
 *         required service action. */
enum class Priority
{
    /** Serivce is mandatory. */
    HIGH,

    /** Serivce medium priority callouts one at a time, in order, until the
     *  issue is resolved. */
    MED,

    /** Same as MED, except replace all A's as a group. */
    MED_A,

    /** Same as MED, except replace all B's as a group. */
    MED_B,

    /** Same as MED, except replace all C's as a group. */
    MED_C,

    /** If servicing all high and medium priority callouts did not resolve
     *  the issue, service low priority callouts one at a time, in order,
     *  until the issue is resolved. */
    LOW,
};

/** @return The string representation of the priority used in callouts. */
inline std::string getString(Priority i_priority)
{
    // clang-format off
    static const std::map<Priority, std::string> m =
    {
        {Priority::HIGH,  "H"},
        {Priority::MED,   "M"},
        {Priority::MED_A, "A"},
        {Priority::MED_B, "B"},
        {Priority::MED_C, "C"},
        {Priority::LOW,   "L"},
    };
    // clang-format on

    return m.at(i_priority);
}

/** @return The string representation of the priority used in The callout FFDC.
 */
inline std::string getStringFFDC(Priority i_priority)
{
    // clang-format off
    static const std::map<Priority, std::string> m =
    {
        {Priority::HIGH,  "high"},
        {Priority::MED,   "medium"},
        {Priority::MED_A, "medium_group_A"},
        {Priority::MED_B, "medium_group_B"},
        {Priority::MED_C, "medium_group_C"},
        {Priority::LOW,   "low"},
    };
    // clang-format on

    return m.at(i_priority);
}

/** These SRC subsystem values are defined by the PEL spec. */
enum class SrcSubsystem
{
    // Can also reference `extensions/openpower-pels/pel_values.cpp` from
    // `openbmc/phosphor-logging` for the full list of these values.

    PROCESSOR = 0x10,
    PROCESSOR_FRU = 0x11,
    PROCESSOR_UNIT = 0x13,
    PROCESSOR_BUS = 0x14,

    MEMORY_CTLR = 0x21,
    MEMORY_BUS = 0x22,
    MEMORY_DIMM = 0x23,
    MEMORY_FRU = 0x24,

    PHB = 0x38,

    CEC_HARDWARE = 0x50,
    CEC_CLOCKS = 0x58,
    CEC_TOD = 0x5A,

    OTHERS = 0x70,
};

/** @brief Container class for procedure callout service actions. */
class Procedure
{
  public:
    /** Contact next level support. */
    static const Procedure NEXTLVL;

    /** An unrecoverable event occurred, look for previous errors for the
     *  cause. */
    static const Procedure SUE_SEEN;

  private:
    /**
     * @brief Constructor from components.
     * @param i_string The string representation of the procedure used for
     *                 callouts.
     */
    Procedure(const std::string& i_string, const SrcSubsystem i_subsystem) :
        iv_string(i_string), iv_subsystem(i_subsystem)
    {}

  private:
    /** The string representation of the procedure used for callouts. */
    const std::string iv_string;

    /** The associated SRC subsystem of the procedure. */
    const SrcSubsystem iv_subsystem;

  public:
    /** iv_string accessor */
    std::string getString() const
    {
        return iv_string;
    }

    /** iv_subsystem accessor */
    SrcSubsystem getSrcSubsystem() const
    {
        return iv_subsystem;
    }
};

inline const Procedure Procedure::NEXTLVL{"next_level_support",
                                          SrcSubsystem::OTHERS};
inline const Procedure Procedure::SUE_SEEN{"find_sue_root_cause",
                                           SrcSubsystem::OTHERS};

/** @brief Container class for bus callout service actions. */
class BusType
{
  public:
    /** SMP bus (fabric A or X bus). */
    static const BusType SMP_BUS;

    /** OMI bus (memory bus). */
    static const BusType OMI_BUS;

  private:
    /**
     * @brief Constructor from components.
     * @param i_string The string representation of the procedure used for
     *                 callouts.
     */
    BusType(const std::string& i_string, const SrcSubsystem i_subsystem) :
        iv_string(i_string), iv_subsystem(i_subsystem)
    {}

  private:
    /** The string representation of the procedure used for callouts. */
    const std::string iv_string;

    /** The associated SRC subsystem of the bus. */
    const SrcSubsystem iv_subsystem;

  public:
    bool operator==(const BusType& r) const
    {
        return ((this->iv_string == r.iv_string) &&
                (this->iv_subsystem == r.iv_subsystem));
    }

    /** iv_string accessor */
    std::string getString() const
    {
        return iv_string;
    }

    /** iv_subsystem accessor */
    SrcSubsystem getSrcSubsystem() const
    {
        return iv_subsystem;
    }
};

inline const BusType BusType::SMP_BUS{"SMP_BUS", SrcSubsystem::PROCESSOR_BUS};
inline const BusType BusType::OMI_BUS{"OMI_BUS", SrcSubsystem::MEMORY_BUS};

/** @brief Container class for clock callout service actions. */
class ClockType
{
  public:
    /** Oscillator reference clock 0. */
    static const ClockType OSC_REF_CLOCK_0;

    /** Oscillator reference clock 1. */
    static const ClockType OSC_REF_CLOCK_1;

    /** Time of Day (TOD) clock. */
    static const ClockType TOD_CLOCK;

  private:
    /**
     * @brief Constructor from components.
     * @param i_string The string representation of the procedure used for
     *                 callouts.
     */
    ClockType(const std::string& i_string, const SrcSubsystem i_subsystem) :
        iv_string(i_string), iv_subsystem(i_subsystem)
    {}

  private:
    /** The string representation of the procedure used for callouts. */
    const std::string iv_string;

    /** The associated SRC subsystem of the clock. */
    const SrcSubsystem iv_subsystem;

  public:
    /** iv_string accessor */
    std::string getString() const
    {
        return iv_string;
    }

    /** iv_subsystem accessor */
    SrcSubsystem getSrcSubsystem() const
    {
        return iv_subsystem;
    }
};

inline const ClockType ClockType::OSC_REF_CLOCK_0{"OSC_REF_CLOCK_0",
                                                  SrcSubsystem::CEC_CLOCKS};
inline const ClockType ClockType::OSC_REF_CLOCK_1{"OSC_REF_CLOCK_1",
                                                  SrcSubsystem::CEC_CLOCKS};
inline const ClockType ClockType::TOD_CLOCK{"TOD_CLOCK", SrcSubsystem::CEC_TOD};

/** @brief Container class for part callout service actions. */
class PartType
{
  public:
    /** The part containing the PNOR. */
    static const PartType PNOR;

  private:
    /**
     * @brief Constructor from components.
     * @param i_string The string representation of the part callout.
     */
    PartType(const std::string& i_string, const SrcSubsystem i_subsystem) :
        iv_string(i_string), iv_subsystem(i_subsystem)
    {}

  private:
    /** The string representation of the part callout. */
    const std::string iv_string;

    /** The associated SRC subsystem of the part. */
    const SrcSubsystem iv_subsystem;

  public:
    bool operator==(const PartType& r) const
    {
        return ((this->iv_string == r.iv_string) &&
                (this->iv_subsystem == r.iv_subsystem));
    }

    /** iv_string accessor */
    std::string getString() const
    {
        return iv_string;
    }

    /** iv_subsystem accessor */
    SrcSubsystem getSrcSubsystem() const
    {
        return iv_subsystem;
    }
};

inline const PartType PartType::PNOR{"PNOR", SrcSubsystem::CEC_HARDWARE};

/** @brief Container class for guard service actions. */
class GuardType
{
  public:
    /** Do not guard. */
    static const GuardType NONE;

    /** Guard on fatal error (cannot recover resource). */
    static const GuardType UNRECOVERABLE;

    /** Guard on non-fatal error (can recover resource). */
    static const GuardType PREDICTIVE;

  private:
    /**
     * @brief Constructor from components.
     * @param i_string The string representation of the procedure used for
     *                 callouts.
     */
    explicit GuardType(const std::string& i_string) : iv_string(i_string) {}

  private:
    /** The string representation of the procedure used for callouts. */
    const std::string iv_string;

  public:
    bool operator==(const GuardType& r) const
    {
        return this->iv_string == r.iv_string;
    }

    /** iv_string accessor */
    std::string getString() const
    {
        return iv_string;
    }
};

inline const GuardType GuardType::NONE{"GARD_NULL"};
inline const GuardType GuardType::UNRECOVERABLE{"GARD_Unrecoverable"};
inline const GuardType GuardType::PREDICTIVE{"GARD_Predictive"};

} // namespace callout

} // namespace analyzer
