#!/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,
                                      REST_USERNAME, REST_PASSWORD, 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()
