#!/usr/bin/env python3

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

import os
import sys

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

    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,
                                      REDFISH_SUPPORT_TRANS_STATE, keyword_string, lib_file_path, quiet,
                                      test_mode, debug, outputdir, output, log, report)

    if not robot_cmd_fnc(cmd_buf):
        print_error_report("Robot command execution failed.")
        exit(1)


main()
