/**
 * Copyright © 2019 IBM 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 "pel_values.hpp"

#include <algorithm>

namespace openpower
{
namespace pels
{
namespace pel_values
{

// Note: The description fields will be filled in as part of the
//       PEL parser work.

/**
 * The possible values for the subsystem field  in the User Header.
 */
const PELValues subsystemValues = {{0x10, "processor", "TODO"},
                                   {0x11, "processor_fru", "TODO"},
                                   {0x12, "processor_chip", "TODO"},
                                   {0x13, "processor_unit", "TODO"},
                                   {0x14, "processor_bus", "TODO"},

                                   {0x20, "memory", "TODO"},
                                   {0x21, "memory_ctlr", "TODO"},
                                   {0x22, "memory_bus", "TODO"},
                                   {0x23, "memory_dimm", "TODO"},
                                   {0x24, "memory_fru", "TODO"},
                                   {0x25, "external_cache", "TODO"},

                                   {0x30, "io", "TODO"},
                                   {0x31, "io_hub", "TODO"},
                                   {0x32, "io_bridge", "TODO"},
                                   {0x33, "io_bus", "TODO"},
                                   {0x34, "io_processor", "TODO"},
                                   {0x35, "io_hub_other", "TODO"},
                                   {0x38, "phb", "TODO"},

                                   {0x40, "io_adapter", "TODO"},
                                   {0x41, "io_adapter_comm", "TODO"},
                                   {0x46, "io_device", "TODO"},
                                   {0x47, "io_device_dasd", "TODO"},
                                   {0x4C, "io_external_general", "TODO"},
                                   {0x4D, "io_external_workstation", "TODO"},
                                   {0x4E, "io_storage_mezz", "TODO"},

                                   {0x50, "cec_hardware", "TODO"},
                                   {0x51, "cec_sp_a", "TODO"},
                                   {0x52, "cec_sp_b", "TODO"},
                                   {0x53, "cec_node_controller", "TODO"},
                                   {0x55, "cec_vpd", "TODO"},
                                   {0x56, "cec_i2c", "TODO"},
                                   {0x57, "cec_chip_iface", "TODO"},
                                   {0x58, "cec_clocks", "TODO"},
                                   {0x59, "cec_op_panel", "TODO"},
                                   {0x5A, "cec_tod", "TODO"},
                                   {0x5B, "cec_storage_device", "TODO"},
                                   {0x5C, "cec_sp_hyp_iface", "TODO"},
                                   {0x5D, "cec_service_network", "TODO"},
                                   {0x5E, "cec_sp_hostboot_iface", "TODO"},

                                   {0x60, "power", "TODO"},
                                   {0x61, "power_supply", "TODO"},
                                   {0x62, "power_control_hw", "TODO"},
                                   {0x63, "power_fans", "TODO"},
                                   {0x64, "power_sequencer", "TODO"},

                                   {0x70, "others", "TODO"},
                                   {0x71, "other_hmc", "TODO"},
                                   {0x72, "other_test_tool", "TODO"},
                                   {0x73, "other_media", "TODO"},
                                   {0x74, "other_multiple_subsystems", "TODO"},
                                   {0x75, "other_na", "TODO"},
                                   {0x76, "other_info_src", "TODO"},

                                   {0x7A, "surv_hyp_lost_sp", "TODO"},
                                   {0x7B, "surv_sp_lost_hyp", "TODO"},
                                   {0x7C, "surv_sp_lost_hmc", "TODO"},
                                   {0x7D, "surv_hmc_lost_lpar", "TODO"},
                                   {0x7E, "surv_hmc_lost_bpa", "TODO"},
                                   {0x7F, "surv_hmc_lost_hmc", "TODO"},

                                   {0x80, "platform_firmware", "TODO"},
                                   {0x81, "sp_firmware", "TODO"},
                                   {0x82, "hyp_firmware", "TODO"},
                                   {0x83, "partition_firmware", "TODO"},
                                   {0x84, "slic_firmware", "TODO"},
                                   {0x85, "spcn_firmware", "TODO"},
                                   {0x86, "bulk_power_firmware_side_a", "TODO"},
                                   {0x87, "hmc_code_firmware", "TODO"},
                                   {0x88, "bulk_power_firmware_side_b", "TODO"},
                                   {0x89, "virtual_sp", "TODO"},
                                   {0x8A, "hostboot", "TODO"},
                                   {0x8B, "occ", "TODO"},
                                   {0x8D, "bmc_firmware", "TODO"},

                                   {0x90, "software", "TODO"},
                                   {0x91, "os_software", "TODO"},
                                   {0x92, "xpf_software", "TODO"},
                                   {0x93, "app_software", "TODO"},

                                   {0xA0, "ext_env", "TODO"},
                                   {0xA1, "input_power_source", "TODO"},
                                   {0xA2, "ambient_temp", "TODO"},
                                   {0xA3, "user_error", "TODO"},
                                   {0xA4, "corrosion", "TODO"}};

/**
 * The possible values for the severity field in the User Header.
 */
const PELValues severityValues = {
    {0x00, "non_error", "TODO"},

    {0x10, "recovered", "TODO"},
    {0x20, "predictive", "TODO"},
    {0x21, "predictive_degraded_perf", "TODO"},
    {0x22, "predictive_reboot", "TODO"},
    {0x23, "predictive_reboot_degraded", "TODO"},
    {0x24, "predictive_redundancy_loss", "TODO"},

    {0x40, "unrecoverable", "TODO"},
    {0x41, "unrecoverable_degraded_perf", "TODO"},
    {0x44, "unrecoverable_redundancy_loss", "TODO"},
    {0x45, "unrecoverable_redundancy_loss_perf", "TODO"},
    {0x48, "unrecoverable_loss_of_function", "TODO"},

    {0x50, "critical", "TODO"},
    {0x51, "critical_system_term", "TODO"},
    {0x52, "critical_imminent_failure", "TODO"},
    {0x53, "critical_partition_term", "TODO"},
    {0x54, "critical_partition_imminent_failure", "TODO"},

    {0x60, "diagnostic_error", "TODO"},
    {0x61, "diagnostic_error_incorrect_results", "TODO"},

    {0x71, "symptom_recovered", "TODO"},
    {0x72, "symptom_predictive", "TODO"},
    {0x74, "symptom_unrecoverable", "TODO"},
    {0x75, "symptom_critical", "TODO"},
    {0x76, "symptom_diag_err", "TODO"}};

/**
 * The possible values for the Event Type field in the User Header.
 */
const PELValues eventTypeValues = {{0x00, "na", "TODO"},
                                   {0x01, "misc_information_only", "TODO"},
                                   {0x02, "tracing_event", "TODO"},
                                   {0x08, "dump_notification", "TODO"}};

/**
 * The possible values for the Event Scope field in the User Header.
 */
const PELValues eventScopeValues = {
    {0x01, "single_partition", "TODO"},
    {0x02, "multiple_partitions", "TODO"},
    {0x03, "entire_platform", "TODO"},
    {0x04, "possibly_multiple_platforms", "TODO"}};

/**
 * The possible values for the Action Flags field in the User Header.
 */
const PELValues actionFlagsValues = {
    {0x8000, "service_action", "TODO"}, {0x4000, "hidden", "TODO"},
    {0x2000, "report", "TODO"},         {0x1000, "dont_report", "TODO"},
    {0x0800, "call_home", "TODO"},      {0x0100, "termination", "TODO"}};

/**
 * The possible values for the Callout Priority field in the SRC.
 */
const PELValues calloutPriorityValues = {
    {'H', "high", "TODO"},           {'M', "medium", "TODO"},
    {'A', "medium_group_a", "TODO"}, {'B', "medium_group_b", "TODO"},
    {'C', "medium_group_c", "TODO"}, {'L', "low", "TODO"}};

PELValues::const_iterator findByValue(uint32_t value, const PELValues& fields)
{
    return std::find_if(fields.begin(), fields.end(),
                        [value](const auto& entry) {
                            return value == std::get<fieldValuePos>(entry);
                        });
}

PELValues::const_iterator findByName(const std::string& name,
                                     const PELValues& fields)

{
    return std::find_if(fields.begin(), fields.end(),
                        [&name](const auto& entry) {
                            return name == std::get<registryNamePos>(entry);
                        });
}

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

    {"PH", "Private Header"},
    {"UH", "User Header"},
    {"PS", "Primary SRC"},
    {"SS", "Secondary SRC"},
    {"EH", "Extended User Header"},
    {"MT", "Failing MTMS"},
    {"DH", "Dump Location"},
    {"SW", "Firmware Error"},
    {"LP", "Impacted Part"},
    {"LR", "Logical Resource"},
    {"HM", "HMC ID"},
    {"EP", "EPOW"},
    {"IE", "IO Event"},
    {"MI", "MFG Info"},
    {"CH", "Call Home"},
    {"UD", "User Data"},
    {"EI", "Env Info"},
    {"ED", "Extended User Data"},
};

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