#!/usr/bin/env python3

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

import json

import func_args as fa
import gen_print as gp
import requests
from redfish.rest.v1 import HttpClient
from robot.libraries.BuiltIn import BuiltIn

host = BuiltIn().get_variable_value("${OPENBMC_HOST}")
MTLS_ENABLED = BuiltIn().get_variable_value("${MTLS_ENABLED}")
CERT_DIR_PATH = BuiltIn().get_variable_value("${CERT_DIR_PATH}")
VALID_CERT = BuiltIn().get_variable_value("${VALID_CERT}")


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.
        - Callers may include inline python code strings to define arguments.  This predominantly benefits
          robot callers.

          For example, instead of calling like this:
            ${data}=  Create Dictionary  HostName=${hostname}
            Redfish.patch  ${REDFISH_NW_PROTOCOL_URI}  body=&{data}

          Callers may do this:

            Redfish.patch  ${REDFISH_NW_PROTOCOL_URI}
            ...  body=[('HostName', '${hostname}')]

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

        Timeout for GET/POST/PATCH/DELETE operations. By default 30 seconds, else user defined value.
        Similarly, Max retry by default 10 attempt for the operation, else user defined value.
        """
        gp.qprint_executing(stack_frame_ix=3, style=gp.func_line_style_short)
        # Convert python string object definitions to objects (mostly useful for robot callers).
        args = fa.args_to_objects(args)
        kwargs = fa.args_to_objects(kwargs)
        timeout = kwargs.pop("timeout", 30)
        self._timeout = timeout
        max_retry = kwargs.pop("max_retry", 10)
        self._max_retry = max_retry
        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):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.get_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).get, *args, **kwargs
            )

    def head(self, *args, **kwargs):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.head_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).head, *args, **kwargs
            )

    def post(self, *args, **kwargs):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.post_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).post, *args, **kwargs
            )

    def put(self, *args, **kwargs):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.put_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).put, *args, **kwargs
            )

    def patch(self, *args, **kwargs):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.patch_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).patch, *args, **kwargs
            )

    def delete(self, *args, **kwargs):
        if MTLS_ENABLED == "True":
            return self.rest_request(self.delete_with_mtls, *args, **kwargs)
        else:
            return self.rest_request(
                super(redfish_plus, self).delete, *args, **kwargs
            )

    def __del__(self):
        del self

    def get_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        response = requests.get(
            url="https://" + host + args[0],
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Cache-Control": "no-cache"},
        )

        response.status = response.status_code
        if response.status == 200:
            response.dict = json.loads(response.text)

        return response

    def post_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        body = kwargs.pop("body", {})
        response = requests.post(
            url="https://" + host + args[0],
            json=body,
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Content-Type": "application/json"},
        )

        response.status = response.status_code

        return response

    def patch_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        body = kwargs.pop("body", {})
        response = requests.patch(
            url="https://" + host + args[0],
            json=body,
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Content-Type": "application/json"},
        )

        response.status = response.status_code

        return response

    def delete_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        response = requests.delete(
            url="https://" + host + args[0],
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Content-Type": "application/json"},
        )

        response.status = response.status_code

        return response

    def put_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        body = kwargs.pop("body", {})
        response = requests.put(
            url="https://" + host + args[0],
            json=body,
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Content-Type": "application/json"},
        )

        response.status = response.status_code

        return response

    def head_with_mtls(self, *args, **kwargs):
        cert_dict = kwargs.pop("certificate", {"certificate_name": VALID_CERT})
        body = kwargs.pop("body", {})
        response = requests.head(
            url="https://" + host + args[0],
            json=body,
            cert=CERT_DIR_PATH + "/" + cert_dict["certificate_name"],
            verify=False,
            headers={"Content-Type": "application/json"},
        )

        response.status = response.status_code

        return response
