from apps.permissions.models import UserCompanyRole
from apps.userprofile.repositories import BaseRepository


class UserCompanyRoleRepository(BaseRepository):
    model = UserCompanyRole

    def get_user_company_role(self, user):
        return self.get_queryset().filter(
            user=user,
            role__isnull=False,
        )

    def has_role(self, user):
        return self.get_user_company_role(user).exists()

    @staticmethod
    def get_memberships_queryset(
            user=None,
            company=None,
            is_active=None,
            is_available=None,
            is_default=None,
            is_owner=None,
    ):
        repo = UserCompanyRoleRepository()
        qs = repo.get_queryset()

        if user:
            qs = qs.filter(user=user)

        if company:
            qs = qs.filter(company=company)

        if is_active:
            qs = qs.filter(is_active=is_active)

        if is_available:
            qs = qs.filter(is_available=is_available)

        if is_default:
            qs = qs.filter(is_default=is_default)

        if is_owner:
            qs = qs.filter(is_owner=is_owner)

        return qs

    @staticmethod
    def get_active_memberships():
        """
        Return active memberships
        """
        return UserCompanyRole.objects.filter(
            is_active=True,
            user__is_active=True,
        )

    @staticmethod
    def get_memberships(user=None, company=None):
        """
        Return active memberships.
        Optionally filter by user or/and company.
        """
        qs = UserCompanyRoleRepository.get_active_memberships()

        if user:
            qs = qs.filter(user=user)

        if company:
            qs = qs.filter(company=company)

        return qs

    @staticmethod
    def get_company_memberships(company):
        """
        Return active memberships for a company.
        """
        return UserCompanyRoleRepository.get_active_memberships().filter(
            company=company,
        )
