#!/usr/bin/env python3

r"""
Set the auto_boot policy according to the caller's wishes.
"""

import os
import sys
import time

save_dir_path = sys.path.pop(0)

modules = [
    "gen_arg",
    "gen_print",
    "gen_valid",
    "gen_misc",
    "gen_cmd",
    "gen_plug_in_utils",
    "gen_call_robot",
]
for module in modules:
    exec("from " + module + " import *")

sys.path.insert(0, save_dir_path)


# Set exit_on_error for gen_valid functions.
set_exit_on_error(True)

parser = argparse.ArgumentParser(
    usage="%(prog)s [OPTIONS]",
    description=(
        "%(prog)s will set the auto_boot policy according to the user's"
        " wishes."
    ),
    formatter_class=argparse.RawTextHelpFormatter,
    prefix_chars="-+",
)


# Populate stock_list with options we want.
stock_list = [
    ("test_mode", get_plug_default("test_mode", 0)),
    ("quiet", get_plug_default("quiet", 0)),
    ("debug", get_plug_default("debug", 0)),
]

AUTO_REBOOT_DISABLE = "1"


def validate_parms():
    r"""
    Validate program parameters, etc.  Return True or False (i.e. pass/fail) accordingly.
    """

    get_plug_vars()

    valid_value(AUTOBOOT_OPENBMC_HOST)
    global AUTO_REBOOT_DISABLE
    if pgm_name == "cp_cleanup":
        AUTO_REBOOT_DISABLE = 0
    else:
        valid_value(AUTO_REBOOT_DISABLE, valid_values=["0", "1"])
        AUTO_REBOOT_DISABLE = int(AUTO_REBOOT_DISABLE)


def main():
    gen_setup()

    set_term_options(term_requests="children")

    print_plug_in_header()

    if pgm_name == "cp_setup" or pgm_name == "cp_cleanup":
        exit_not_master()

    init_robot_out_parms(get_plug_in_package_name() + "." + pgm_name + ".")

    lib_file_path = init_robot_file_path("lib/utils.robot")

    REDFISH_SUPPORT_TRANS_STATE = int(
        os.environ.get("REDFISH_SUPPORT_TRANS_STATE", 0)
    ) or int(os.environ.get("AUTOBOOT_REDFISH_SUPPORT_TRANS_STATE", 0))

    enable_auto_reboot = 1 - AUTO_REBOOT_DISABLE
    print_var(enable_auto_reboot)
    keyword_string = "Set Auto Reboot Setting  ${%i}" % enable_auto_reboot

    cmd_buf = create_robot_cmd_string(
        "extended/run_keyword.robot",
        OPENBMC_HOST,
        SSH_PORT,
        HTTPS_PORT,
        OPENBMC_USERNAME,
        OPENBMC_PASSWORD,
        IPMI_USERNAME,
        IPMI_PASSWORD,
        REDFISH_SUPPORT_TRANS_STATE,
        keyword_string,
        lib_file_path,
        quiet,
        test_mode,
        debug,
        outputdir,
        output,
        log,
        report,
    )

    retry_count = 3
    while not robot_cmd_fnc(cmd_buf):
        retry_count -= 1
        if retry_count == 0:
            print_error_report("Robot command execution failed.")
            exit(1)
        time.sleep(30)
    return


main()
