from django.core.exceptions import ValidationError
from django.db.models import Q
from django.db.models.aggregates import Count

from apps.companies.constants import CompanyType
from apps.companies.models import Company


class CompanyRepository:
    @staticmethod
    def get_queryset():
        return Company.objects.all()
        #     (
        #     Q(company_type=CompanyType.SIMPLE) |
        #     Q(company_type=CompanyType.DEALERSHIP_GROUP),
        # ))

    @staticmethod
    def get_active_company(company_id):

        company = CompanyRepository.get_queryset().filter(
            id=company_id,
            is_active=True,
        ).first()

        if not company:
            raise ValidationError("Company not found or inactive")

        return company

    @staticmethod
    def qs_with_dashboard_data(user):
        qs = (
            CompanyRepository.get_queryset()
            if user.is_superuser
            else user.companies.all()
        )
        return CompanyRepository._with_dashboard_data(qs)

    @staticmethod
    def _with_dashboard_data(qs):
        return qs.prefetch_related(
            'missing_call_notify_to',
            'office_hours',
            'sales_timings',
            'catch_phrases',
        ).select_related('default_transfer_staff').annotate(
            user_count=Count('users', distinct=True),
            active_users_count=Count(
                'users',
                filter=Q(users__is_active=True),
                distinct=True
            ),
            inactive_users_count=Count(
                'users',
                filter=Q(users__is_active=False),
                distinct=True
            ),
            available_users_count=Count(
                'users',
                filter=Q(
                    users__is_active=True,
                    users__is_available=True
                ),
                distinct=True
            ),
        )
