#!/usr/bin/env python

r"""
See redfish_plus class prolog below for details.
"""

from redfish.rest.v1 import HttpClient
import gen_print as gp


def valid_http_status_code(status, valid_status_codes):
    r"""
    Raise exception if status is not found in the valid_status_codes list.

    Description of argument(s):
    status                          An HTTP status code (e.g. 200, 400, etc.).
    valid_status_codes              A list of status codes that the caller
                                    considers acceptable.  If this is a null
                                    list, then any status code is considered
                                    acceptable.  Note that for the convenience
                                    of the caller, valid_status_codes may be
                                    either a python list or a string which can
                                    be evaluated to become a python list (e.g.
                                    "[200]").
    """

    if type(valid_status_codes) is not list:
        valid_status_codes = eval(valid_status_codes)
    if len(valid_status_codes) == 0:
        return
    if status in valid_status_codes:
        return

    message = "The HTTP status code was not valid:\n"
    message += gp.sprint_vars(status, valid_status_codes)
    raise ValueError(message)


class redfish_plus(HttpClient):
    r"""
    redfish_plus is a wrapper for redfish rest that provides the following
    benefits vs. using redfish directly:

    For rest_request functions (e.g. get, put, post, etc.):
        - Function-call logging to stdout.
        - Automatic valid_status_codes processing (i.e. an exception will be
          raised if the rest response status code is not as expected.
        - Easily used from robot programs.
    """

    ROBOT_LIBRARY_SCOPE = 'TEST SUITE'

    def rest_request(self, func, *args, **kwargs):
        r"""
        Perform redfish rest request and return response.

        This function provides the following additional functionality.
        - The calling function's call line is logged to standard out (provided
          that global variable "quiet" is not set).
        - The caller may include a valid_status_codes argument.

        Description of argument(s):
        func                        A reference to the parent class function
                                    which is to be called (e.g. get, put,
                                    etc.).
        args                        This is passed directly to the function
                                    referenced by the func argument (see the
                                    documentation for the corresponding
                                    redfish HttpClient method for details).
        kwargs                      This is passed directly to the function
                                    referenced by the func argument (see the
                                    documentation for the corresponding
                                    redfish HttpClient method for details)
                                    with the following exception:  If kwargs
                                    contains a valid_status_codes key, it will
                                    be removed from kwargs and processed by
                                    this function.  This allows the caller to
                                    indicate what rest status codes are
                                    acceptable.  The default value is [200].
                                    See the valid_http_status_code function
                                    above for details.

        Example uses:

        From a python program:

        response =
        bmc_redfish.get("/redfish/v1/Managers/bmc/EthernetInterfaces", [200,
        201])

        If this call to the get method generates a response.status equal to
        anything other than 200 or 201, an exception will be raised.

        From a robot program:

        BMC_Redfish.logout
        ${response}=  BMC_Redfish.Get
        /redfish/v1/Managers/bmc/EthernetInterfaces  valid_status_codes=[401]

        As part of a robot test, the programmer has logged out to verify that
        the get request will generate a status code of 401 (i.e.
        "Unauthorized").
        """
        gp.qprint_executing(stack_frame_ix=3, style=gp.func_line_style_short)
        valid_status_codes = kwargs.pop('valid_status_codes', [200])
        response = func(*args, **kwargs)
        valid_http_status_code(response.status, valid_status_codes)
        return response

    # Define rest function wrappers.
    def get(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).get, *args,
                                 **kwargs)

    def head(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).head, *args,
                                 **kwargs)

    def post(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).post, *args,
                                 **kwargs)

    def put(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).put, *args,
                                 **kwargs)

    def patch(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).patch, *args,
                                 **kwargs)

    def delete(self, *args, **kwargs):
        return self.rest_request(super(redfish_plus, self).delete, *args,
                                 **kwargs)

    def __del__(self):
        del self
