#!/usr/bin/env python3

r"""
See help text for details.
"""

import sys

save_path_0 = sys.path[0]
del sys.path[0]

from gen_arg import *
from gen_print import *
from gen_valid import *
from openbmc_ffdc_list import *

# Restore sys.path[0].
sys.path.insert(0, save_path_0)

# Set exit_on_error for gen_valid functions.
set_exit_on_error(True)

parser = argparse.ArgumentParser(
    usage="%(prog)s [OPTIONS]",
    description="%(prog)s will print a colon-delimited list of all valid OBMC FFDC functions.\n\nExample:"
    + "\n\n\nDump Log:FFDC Generic Report:Get Request FFDC:SEL Log:BMC Specific Files:Sys Inventory Files"
    + ":Core Files:OS FFDC:Dump Files",
    formatter_class=argparse.RawDescriptionHelpFormatter,
    prefix_chars="-+",
)

# Populate stock_list with options we want.
stock_list = [("test_mode", 0), ("quiet", 1), ("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).
    """

    dprint_executing()
    dprint_var(signal_number)

    qprint_pgm_footer()


def signal_handler(signal_number, frame):
    r"""
    Handle signals.  Without a function to catch a SIGTERM or SIGINT, our program would terminate immediately
    with return code 143 and without calling our exit_function.
    """

    # Our convention is to set up exit_function with atexit.register() so there is no need to explicitly
    # call exit_function from here.

    dprint_executing()

    # Calling exit prevents us from returning to the code that was running when we received the signal.
    exit(0)


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

    gen_post_validation(exit_function, signal_handler)


def main():

    gen_get_options(parser, stock_list)

    validate_parms()

    qprint_pgm_header()

    my_openbmc_ffdc_list = openbmc_ffdc_list()
    ffdc_function_list = my_openbmc_ffdc_list.get_ffdc_method_desc("BMC LOGS")
    # Convert from list to colon-delimited string.
    ffdc_function_list = ":".join(ffdc_function_list)
    print(ffdc_function_list)


main()
