#!/usr/bin/env python3

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

# Set exit_on_error for gen_valid functions.
set_exit_on_error(True)

parser = argparse.ArgumentParser(
    usage='%(prog)s [OPTIONS]',
    description="%(prog)s will determine whether FFDC should be collected.  If so, it will return "
    + repr(dump_ffdc_rc()) + ".",
    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", get_plug_default("test_mode", 0)),
              ("quiet", get_plug_default("quiet", 0)),
              ("debug", get_plug_default("debug", 0))]

# For now we are hard-coding this value vs adding a soft_errors=boolean entry in the parm_def file.
FFDC_SOFT_ERRORS = 1


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()

    valid_value(AUTOBOOT_OPENBMC_HOST)


def main():

    gen_setup()

    print_plug_in_header()

    if FFDC_COMMAND.upper() == "FAIL":
        if AUTOBOOT_BOOT_SUCCESS == "0":
            print_timen("The caller wishes to dump FFDC after each boot failure.")
            exit(dump_ffdc_rc())
    elif FFDC_COMMAND.upper() == "ALL":
        print_timen("The caller wishes to dump FFDC after each boot test.")
        exit(dump_ffdc_rc())
    elif len(FFDC_COMMAND) > 0:
        shell_rc, out_buf = shell_cmd(FFDC_COMMAND, quiet=quiet)
        if shell_rc != 0:
            print_timen("The caller wishes to dump FFDC.")
            exit(dump_ffdc_rc())
    if FFDC_SOFT_ERRORS:
        # Check the num_error_logs value left by the Soft_errors plug-in.
        num_error_logs = int(restore_plug_in_value(0, "Soft_errors"))
        if num_error_logs > 0:
            print_timen("The \"Soft_errors\" plug-in found soft_errors and the"
                        + " caller wishes to dump FFDC on soft errors.")
            exit(dump_ffdc_rc())

    print_timen("The caller does not wish for any FFDC to be collected.")


main()
