#!/usr/bin/env python3

from gen_arg import *
from gen_call_robot import *
from gen_cmd import *
from gen_misc import *
from gen_plug_in_utils import *
from gen_print import *
from gen_valid import *
from var_funcs import *

# Set exit_on_error for gen_valid functions.
set_exit_on_error(True)
ignore_err = 0


parser = argparse.ArgumentParser(
    usage="%(prog)s [OPTIONS]",
    description="%(prog)s will calculate the value of num_err_logs and"
    + " save it as a plug-in value for the benefit of the FFDC plug-in."
    + "  The FFDC plug-in can use that data to decide whether to collect"
    + " FFDC data.",
    formatter_class=argparse.ArgumentDefaultsHelpFormatter,
    prefix_chars="-+",
)

# The stock_list will be passed to gen_get_options.  We populate it with the names of stock parm options we
# want.  These stock parms are pre-defined by gen_get_options.
stock_list = [
    ("test_mode", 0),
    ("quiet", get_plug_default("quiet", 0)),
    ("debug", get_plug_default("debug", 0)),
]


def exit_function(signal_number=0, frame=None):
    r"""
    Execute whenever the program ends normally or with the signals that we catch (i.e. TERM, INT).

    This function will be called by gen_exit_function().
    """

    process_robot_output_files()


def validate_parms():
    r"""
    Validate program parameters, etc.

    This function will be called by gen_setup().
    """

    get_plug_vars()

    global AUTOSCRIPT_STATUS_FILE_PATH
    # AUTOSCRIPT_STATUS_FILE_PATH is set when we're called by autoscript.  For this program to work
    # correctly, it must be called with autoscript.
    AUTOSCRIPT_STATUS_FILE_PATH = os.environ.get(
        "AUTOSCRIPT_STATUS_FILE_PATH", ""
    )
    valid_value(AUTOSCRIPT_STATUS_FILE_PATH)
    valid_value(AUTOBOOT_OPENBMC_HOST)


def main():
    gen_setup()

    print_plug_in_header()

    # Get the number of error logs from the BMC.
    init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")
    high_sev_elogs_file_path = (
        AUTOBOOT_FFDC_DIR_PATH
        + AUTOBOOT_FFDC_PREFIX
        + "high_severity_errorlog.json"
    )
    lib_file_path = init_robot_file_path("lib/logging_utils.robot")
    lib_file_path += ":" + init_robot_file_path("lib/gen_robot_print.py")
    set_mod_global(lib_file_path)

    REDFISH_SUPPORT_TRANS_STATE = int(
        os.environ.get("REDFISH_SUPPORT_TRANS_STATE", 0)
    )
    if not REDFISH_SUPPORT_TRANS_STATE:
        try:
            from robot.libraries.BuiltIn import BuiltIn

            REDFISH_SUPPORT_TRANS_STATE = int(
                BuiltIn().get_variable_value(
                    "${REDFISH_SUPPORT_TRANS_STATE}", default=0
                )
            )
        except Exception:
            pass

    keyword_redfish_strings = [
        (
            "${error_logs}=  Get Redfish Event Logs "
            " &{filter_low_severity_errlogs}"
        ),
        "${num_error_logs}=  Get Length  ${error_logs}",
        "Rprint Vars  num_error_logs",
        (
            "${json_string}=  Evaluate  json.dumps($error_logs, indent=4) "
            " modules=json"
        ),
        "Append To File  " + high_sev_elogs_file_path + "  ${json_string}",
    ]

    keyword_strings = [
        "${error_logs}=  Get Error Logs  &{filter_low_severity_errlogs}",
        "${num_error_logs}=  Get Length  ${error_logs}",
        "Rprint Vars  num_error_logs",
        (
            "${json_string}=  Evaluate  json.dumps($error_logs, indent=4) "
            " modules=json"
        ),
        "Append To File  " + high_sev_elogs_file_path + "  ${json_string}",
    ]

    if REDFISH_SUPPORT_TRANS_STATE:
        keyword_string = " ; ".join(keyword_redfish_strings)
    else:
        keyword_string = " ; ".join(keyword_strings)

    set_mod_global(keyword_string)
    cmd_buf = create_robot_cmd_string(
        "extended/run_keyword.robot",
        OPENBMC_HOST,
        SSH_PORT,
        HTTPS_PORT,
        REST_USERNAME,
        REST_PASSWORD,
        OPENBMC_USERNAME,
        OPENBMC_PASSWORD,
        keyword_string,
        lib_file_path,
        quiet,
        test_mode,
        debug,
        outputdir,
        output,
        log,
        report,
    )
    if not robot_cmd_fnc(cmd_buf):
        exit(1)
    # The output contains the num_error_logs value which we will isolate with egrep.
    rc, out_buf = shell_cmd(
        "egrep '^num_error_logs:[ ]' " + AUTOSCRIPT_STATUS_FILE_PATH,
        quiet=1,
        print_output=0,
    )
    result = key_value_outbuf_to_dict(out_buf)
    num_error_logs = int(result["num_error_logs"])
    save_plug_in_value(num_error_logs)
    if num_error_logs > 0:
        qprint_timen(
            "Adding the name of our high severity error logs FFDC file "
            + "to the appropriate file list."
        )
        shell_cmd(
            "echo "
            + high_sev_elogs_file_path
            + " > "
            + AUTOBOOT_FFDC_LIST_FILE_PATH
        )
    else:
        os.remove(high_sev_elogs_file_path)


main()
