#pragma once

#include "pel_types.hpp"

#include <cstdint>
#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
