#!/usr/bin/env python3

r"""
PEL functions.
"""

import func_args as fa
import bmc_ssh_utils as bsu
import json


class peltool_exception(Exception):
    r"""
    Base class for peltool related exceptions.
    """
    def __init__(self, message):
        self.message = message
        super().__init__(self.message)


def peltool(option_string, parse_json=True, **bsu_options):
    r"""
    Run peltool on the BMC with the caller's option string and return the result.

    Example:

    ${pel_results}=  Peltool  -l
    Rprint Vars  pel_results

    pel_results:
      [0x50000031]:
        [CompID]:                       0x1000
        [PLID]:                         0x50000031
        [Subsystem]:                    BMC Firmware
        [Message]:                      An application had an internal failure
        [SRC]:                          BD8D1002
        [Commit Time]:                  02/25/2020  04:51:31
        [Sev]:                          Unrecoverable Error
        [CreatorID]:                    BMC

    Description of argument(s):
    option_string                   A string of options which are to be processed by the peltool command.
    parse_json                      Indicates that the raw JSON data should parsed into a list of
                                    dictionaries.
    bsu_options                     Options to be passed directly to bmc_execute_command. See its prolog for
                                    details.
    """

    bsu_options = fa.args_to_objects(bsu_options)
    out_buf, stderr, rc = bsu.bmc_execute_command('peltool ' + option_string, **bsu_options)
    if parse_json:
        try:
            return json.loads(out_buf)
        except json.JSONDecodeError:
            return {}
    return out_buf


def fetch_pelId_For_SRC(src_id):
    r"""
    Fetch PEL ID for the input SRC ID

    Description of arguments:
    src_id  SRC ID (e.g. BC20E504)
    """

    src_pel_id = []
    try:
        pel_data = peltool(" -l")
        pel_id_list = pel_data.keys()
        for i in pel_id_list:
            if pel_data[i]["SRC"] == src_id:
                src_pel_id.append(i)
    except Exception as e:
        raise peltool_exception("Failed to fetch PEL ID for required SRC : " + str(e))
    return src_pel_id


def verify_SRC_details(pel_id, attn_type, target_type, signature_desc,
                       threshold_limit):
    r"""
    Verify SRC details for the given PEL ID based on the required
    target type, attention type, signature description, threshold limit.

    Description of arguments:
    pel_id          PEL ID for the required SRC details to verify
    target_type     Target type (e.g. TYPE_OMIC)
    attn_type       Attention type (e.g. RECCOVERABLE)
    signature_desc  Signature description of the error inject
    threshold_limit Threshold limit (e.g. 1, 5, 32)
    """

    try:
        pel_cmd = " -i " + pel_id
        src_data = peltool(pel_cmd)
        src_dict = src_data["Primary SRC"]["SRC Details"]
        usr_data = src_data["User Data 4"]
        if (src_dict["Attention Type"] != attn_type):
            raise peltool_exception("Required Attention type " + attn_type + " not found")
        if target_type not in src_dict["Target Type"]:
            raise peltool_exception("Required Target type " + target_type + " not found")
        if signature_desc not in src_dict["Signature"]:
            raise peltool_exception("Required Signature " + signature_desc + " not found")

        if (int(threshold_limit) != usr_data["Error Threshold"]):
            raise peltool_exception("Required Threshold limit " + threshold_limit + " not found")

    except Exception as e:
        raise peltool_exception("Failed to verify SRC details : " + str(e))

    return True


def fetch_All_SRC():
    r"""
    Fetch all list of SRC IDs from peltool
    """

    src_id = []
    try:
        pel_data = peltool(" -l")
        pel_id_list = pel_data.keys()
        for i in pel_id_list:
            src_id.append(pel_data[i]["SRC"])
    except Exception as e:
        raise peltool_exception("Failed to fetch all SRCs : " + str(e))
    return src_id
