#!/usr/bin/env python

r"""
This module provides robot keyword execution functions such as run_key..
"""

import gen_print as gp
from robot.libraries.BuiltIn import BuiltIn


def run_key(keyword_buf,
            quiet=None,
            test_mode=None,
            ignore=0):
    r"""
    Run the given keyword, return the status and the keyword return values.

    The advantage of using this function verses having robot simply run your
    keyword is the handling of parameters like quiet, test_mode and ignore.

    Description of arguments:
    keyword_buf                     The keyword string to be run.
    quiet                           Indicates whether this function should run
                                    the pissuing function to print 'Issuing:
                                    <keyword string>' to stdout.
    test_mode                       If test_mode is set, this function will
                                    not actually run the command.  If quiet is
                                    0, it will print a message indicating what
                                    it would have run (e.g. "Issuing:
                                    (test_mode) your command").
    ignore                          Ignore errors from running keyword.  If
                                    this is 0, this function will fail with
                                    whatever error occurred when running the
                                    keyword.

    Example usage from a robot script:

    ${status}  ${ret_values}=  Run Key  My Keyword \ Arg1 \ Arg2

    Note that to get robot to pass your command + args as a single string to
    this function, you must escape extra spaces with a backslash.

    Also note that ret_values is a python list:
    ret_values:
      ret_values[0]:    value1
      ret_values[1]:    value2
    """

    # Set these vars to default values if they are None.
    quiet = int(gp.get_var_value(quiet, 0))
    test_mode = int(gp.get_var_value(test_mode, 0))
    ignore = int(ignore)

    # Convert the keyword_buf into a list split wherever 2 or more spaces are
    # found.
    keyword_list = keyword_buf.split('  ')
    # Strip spaces from each argument to make the output look clean and
    # uniform.
    keyword_list = [item.strip(' ') for item in keyword_list]

    if not quiet:
        # Join the list back into keyword_buf for the sake of output.
        keyword_buf = '  '.join(keyword_list)
        gp.pissuing(keyword_buf, test_mode)

    if test_mode:
        return 'PASS', ""

    try:
        status, ret_values = \
            BuiltIn().run_keyword_and_ignore_error(*keyword_list)
    except Exception as my_assertion_error:
        status = "FAIL"
        ret_values = my_assertion_error.args[0]

    if status != 'PASS':
        # Output the error message to stderr.
        BuiltIn().log_to_console(ret_values, stream='STDERR')
        if not ignore:
            # Fail with the given error message.
            BuiltIn().fail(ret_values)

    return status, ret_values


def run_key_u(keyword_buf,
              quiet=None,
              ignore=0):
    r"""
    Run keyword unconditionally (i.e. without regard to global test_mode
    setting).

    This function will simply call the run_key function passing on all of the
    callers parameters except test_mode which will be hard-coded to 0.  See
    run_key (above) for details.

    See the proglog of "run_key" function above for description of arguments.
    """

    return run_key(keyword_buf, test_mode=0, quiet=quiet, ignore=ignore)
