from apps.userprofile.models import UserProfile

from .base import BaseRepository


class UserProfileRepository(BaseRepository):
    model = UserProfile

    def get_queryset(self):
        return self.model.objects.select_related("user")

    def get_active_profiles(self):
        return self.get_queryset().filter(user__is_active=True)

    def get_for_superuser(self):
        return self.get_active_profiles()

    def get_for_company(self, company):
        return self.get_active_profiles().filter(
            user__companies=company
        )

    def get_for_user(self, user):
        return self.get_active_profiles().filter(user=user)

    def get_for_action(self, *, user, action):
        """
        Central place for action-based filtering
        """
        if action in {"list", "retrieve"}:
            if user.is_superuser:
                return self.get_for_superuser()

            if user.active_company:
                return self.get_for_company(user.active_company)

            return self.get_queryset().none()

        return self.get_for_user(user)

    def get_by_username(self, username):
        return self.get_queryset().filter(
            user__username=username
        ).first()

    @staticmethod
    def get_by_id(profile_id):
        repo = UserProfileRepository()
        return repo.get_queryset().get(id=profile_id)
