from flask import request

from helper_functions import condition_check, set_data
from components import Components
from key_resolver import KeyResolver
from operations import Operations
from logger_module.package_logger import print_log


class ResponseGeneration:

    def __init__(self, schema, endpoint, method):
        self.schema = schema
        self.endpoint = endpoint
        self.method = method

    def generate_response(self, response_code,):
        body = request.get_json
        response_body = self.schema.get('paths').get(self.endpoint).get(self.method).get('responses')
        content = response_body.get(response_code).get('content').get('application/json')
        actions = response_body.get(response_code).get('actions')
        status_code = response_body.get(response_code).get('content').get('status_code')
        if isinstance(content, dict):
            for param, param_val in content.items():
                args = ()
                if isinstance(param_val, dict):
                    for k, v in param_val.items():
                        if "->" in v:
                            split_param = v.split("->")
                            function_name = split_param[0]
                            for items in split_param[1:]:
                                args = args + (KeyResolver().resolve_key(items, body),)
                            value = Components.execute_component(function_name, args)
                        else:
                            value = KeyResolver().resolve_key(v, request_body=body)
                        param_val.update({k: value})
                    content.update({param: param_val})
                else:
                    if "->" in param_val:
                        split_param = param_val.split("->")
                        function_name = split_param[0]
                        args = tuple(split_param[1:])
                        value = Components.execute_component(function_name, args)
                    else:
                        value = KeyResolver().resolve_key(param_val, request_body=body)
                    content.update({param: value})
        if content == 'null':
            return str(content), status_code
        set_data('response', content)
        action_response = self.perform_actions(actions)
        if action_response:
            print_log(content)
            return content, status_code

    @staticmethod
    def perform_actions(action_list):
        if action_list:
            for elem in action_list:
                if elem.get('operation'):
                    action_result = Operations.perform_operation(elem, request.get_json)
                if elem.get('conditions'):
                    condition_check(elem, request.get_json)
        return True
