from helper_functions import *


class RulesAggregator:

    def __init__(self, request, schema, endpoint):
        self.schema = schema
        self.request = request
        self.endpoint = endpoint
        self.body = request.get_json

    def read_rules(self, schema, rule_type='data'):
        # endpoint = self.request.full_path.strip('?')
        method = self.request.method.lower()
        rules = schema.get('paths').get(self.endpoint).get(method).get('requestBody').get('rules')
        if rules:
            return rules.get(rule_type)

    def main(self, ):
        rules_list = self.read_rules(self.schema)
        if rules_list:
            status, rule_operation = self.rules_resolver(rules_list)
            if status != 'SUCCESS':
                response = Operations.perform_operation(rule_operation, self.body)
                return response
            return {'cf_code': 'CF200'}
        return {'cf_code': 'CF200'}

    def rules_resolver(self, checks):
        # for rule in checks:
        #     condition_status = condition_check(rule.get('conditions'), self.body)
        #     if rule.get(str(condition_status).lower()):
        #         return condition_status, rule.get(str(condition_status).lower())
        if checks:
            for rule in checks:
                condition_status = condition_check(rule.get('conditions'), self.body)
                if rule.get(str(condition_status).lower()):
                    if rule.get(str(condition_status).lower()).get('conditions'):
                        while rule.get(str(condition_status).lower()).get('conditions'):
                            rule = rule.get(str(condition_status).lower())
                            condition_status = condition_check(rule.get('conditions'), self.body)
                            if not rule.get(str(condition_status).lower()):
                                break
                            if not rule.get(str(condition_status).lower()).get('conditions'):
                                return condition_status, rule.get(str(condition_status).lower())
                    else:
                        return condition_status, rule.get(str(condition_status).lower())
        return 'SUCCESS', None

