from django.contrib.auth.models import User
from django.db.models import QuerySet, Q

import customrolepermissions


class FifaAccountQuerySet(QuerySet):
    def related_to(self, request_user: User):
        queryset = self._clone()
        if customrolepermissions.permissions.has_permission_exactly(request_user, 'is_management_manager'):
            pass
        elif customrolepermissions.permissions.has_permission_exactly(request_user, 'is_investor'):
            queryset = queryset.filter(
                Q(investor=request_user) |
                Q(console__investor=request_user) |
                Q(console__investor__investor_operator_user__investor=request_user) |
                # bellow is actually owner but not fixed so use it in related
                Q(creator=request_user)
            )
        else:
            queryset = queryset.filter(
                Q(operators=request_user) |
                Q(console__investor__investor_operator_user__operators__id=request_user.id) |
                Q(creator__investor_operator_user__operators__id=request_user.id) |
                # bellow is actually owner but not fixed so use it in related
                Q(creator=request_user)
            )
        return queryset


class ConsoleQuerySet(QuerySet):
    def related_to(self, request_user: User):
        queryset = self._clone()
        if customrolepermissions.permissions.has_permission_exactly(request_user, 'is_management_manager'):
            pass
        elif customrolepermissions.permissions.has_permission_exactly(request_user, 'is_investor'):
            queryset = queryset.filter(
                Q(investor=request_user) | Q(investor__investor_operator_user__investor__id=request_user.id)
            )
        else:
            queryset = queryset.filter(
                Q(investor__investor_operator_user__operators__id=request_user.id)
            )
        return queryset


class ConsoleLastStatusManagerQuerySet(QuerySet):
    def related_to(self, request_user: User):
        queryset = self._clone()
        if customrolepermissions.permissions.has_permission_exactly(request_user, 'is_management_manager'):
            pass
        elif customrolepermissions.permissions.has_permission_exactly(request_user, 'is_investor'):
            queryset = queryset.filter(
                Q(console__investor=request_user) |
                Q(console__investor__investor_operator_user__investor__id=request_user.id)
            )
        else:
            queryset = queryset.filter(
                Q(console__investor__investor_operator_user__operators__id=request_user.id)
            )
        return queryset


class MuleAccountsQuerySet(QuerySet):
    def related_to(self, request_user: User):
        queryset = self._clone()
        if customrolepermissions.permissions.has_permission_exactly(request_user, 'is_management_manager'):
            pass
        elif customrolepermissions.permissions.has_permission_exactly(request_user, 'is_investor'):
            queryset = queryset.filter(
                Q(investors__in=[request_user])
            )
        else:
            queryset = queryset.filter(
                Q(investors__investor_operator_user__operators__id=request_user.id)
            )
        return queryset
