from __future__ import absolute_import
import operator


class UserAttributeService:
    operator_dict = {
        "+": operator.add,
        "-": operator.sub,
        "<": operator.lt,
        "<=": operator.le,
        ">": operator.gt,
        ">=": operator.ge,
        "=": operator.eq,
        "or": operator.or_,
        "and": operator.and_,
    }

    def process_condition(self, user_attribute, operator_for_condition, value):
        operator_object = self.operator_dict.get(operator_for_condition)

        if not operator_object:
            return False

        return operator_object(user_attribute, value)

    def process_results_list(self, results):
        final_result = None
        perform_operation = False
        operator_object = None

        if not results:
            return False

        for operand in results:
            if final_result is None:
                final_result = operand
            if perform_operation:
                final_result = operator_object(final_result, operand)
                perform_operation = False
            elif self.operator_dict.get(operand):
                operator_object = self.operator_dict.get(operand)
                perform_operation = True

        return final_result

    def is_user_attribute_fulfilling_the_condition(
        self, user_attributes, conditions_list
    ):
        node_condition_result_list = []

        for node_condition in conditions_list:
            sub_condition_results_list = []

            for sub_condition in node_condition:
                operator_for_condition = sub_condition.get("operator")
                attribute = sub_condition.get("operand", {}).get("user_attribute")
                attribute_value = sub_condition.get("operand", {}).get("value")
                if sub_condition.get("node_join_condition"):
                    node_condition_result_list.append(
                        sub_condition.get("node_join_condition")
                    )
                    continue
                if sub_condition.get("join_condition"):
                    sub_condition_results_list.append(
                        sub_condition.get("join_condition")
                    )
                    continue

                user_attribute = getattr(user_attributes, attribute)
                result = self.process_condition(
                    user_attribute, operator_for_condition, attribute_value
                )
                sub_condition_results_list.append(result)

            if len(sub_condition_results_list) != 0:
                node_condition_result_list.append(
                    self.process_results_list(sub_condition_results_list)
                )

        return self.process_results_list(node_condition_result_list)
