#pragma once

#include "pel_types.hpp"

#include <map>
#include <string>
#include <tuple>
#include <vector>

namespace openpower
{
namespace pels
{
namespace pel_values
{

// The actual value as it shows up in the PEL
const int fieldValuePos = 0;

// The name of the value as specified in the message registry
const int registryNamePos = 1;

// The description of the field, used by PEL parsers
const int descriptionPos = 2;

using PELFieldValue = std::tuple<uint32_t, const char*, const char*>;
using PELValues = std::vector<PELFieldValue>;

const std::string sectionVer = "Section Version";
const std::string subSection = "Sub-section type";
const std::string createdBy = "Created by";

/**
 * @brief Helper function to get values from lookup tables.
 * @return std::string - the value
 * @param[in] uint8_t - field to get value for
 * @param[in] PELValues - lookup table
 * @param[in] uint8_t - position in the pel_values table to read
 */
std::string getValue(const uint8_t field, const pel_values::PELValues& values,
                     const uint8_t position = pel_values::descriptionPos);

/**
 * @brief Helper function to get value vector from lookup tables.
 *
 * @param[in] value - the value to lookup
 * @param[in] table - lookup table
 *
 * @return std::vector<std::string> - the value vector
 */
std::vector<std::string> getValuesBitwise(uint16_t value,
                                          const pel_values::PELValues& table);
/**
 * @brief Find the desired entry in a PELValues table based on the
 *        field value.
 *
 * @param[in] value - the PEL value to find
 * @param[in] fields - the PEL values table to use
 *
 * @return PELValues::const_iterator - an iterator to the table entry
 */
PELValues::const_iterator findByValue(uint32_t value, const PELValues& fields);

/**
 * @brief Find the desired entry in a PELValues table based on the
 *        field message registry name.
 *
 * @param[in] name - the PEL message registry enum name
 * @param[in] fields - the PEL values table to use
 *
 * @return PELValues::const_iterator - an iterator to the table entry
 */
PELValues::const_iterator findByName(const std::string& name,
                                     const PELValues& fields);

/**
 * @brief The values for the 'subsystem' field in the User Header
 */
extern const PELValues subsystemValues;

/**
 * @brief The values for the 'severity' field in the User Header
 */
extern const PELValues severityValues;

/**
 * @brief The values for the 'Event Type' field in the User Header
 */
extern const PELValues eventTypeValues;

/**
 * @brief The values for the 'Event Scope' field in the User Header
 */
extern const PELValues eventScopeValues;

/**
 * @brief The values for the 'Action Flags' field in the User Header
 */
extern const PELValues actionFlagsValues;

/**
 * @brief The values for callout priorities in the SRC section
 */
extern const PELValues calloutPriorityValues;

/**
 * @brief Map for section IDs
 */
extern const std::map<std::string, std::string> sectionTitles;

/**
 * @brief Map for creator IDs
 */
extern const std::map<std::string, std::string> creatorIDs;

/**
 * @brief Map for transmission states
 */
extern const std::map<TransmissionState, std::string> transmissionStates;

/**
 * @brief Map for Procedure Descriptions
 */
extern const std::map<std::string, std::string> procedureDesc;

/**
 * @brief Map for Callout Failing Component Types
 */
extern const std::map<uint8_t, std::string> failingComponentType;

/**
 * @brief Map for Boolean value
 */
extern const std::map<bool, std::string> boolString;

/**
 * @brief Map for maintenance procedures
 */
extern const std::map<std::string, std::string> maintenanceProcedures;

/**
 * @brief Map for symbolic FRUs.
 */
extern const std::map<std::string, std::string> symbolicFRUs;

} // namespace pel_values
} // namespace pels
} // namespace openpower
