from django.contrib.auth.models import  BaseUserManager
from django.db import models
from django.db.models import F, QuerySet, OuterRef, Count, Subquery
from django.db.models.functions import Coalesce

from apps.vendor.models import Vendor
from apps.consultant.models import Consultant
from apps.contractor.models import Contractor


class ProjectQuerySet(models.QuerySet):
    def annotate_client_name(self):
        return self.annotate(client_name=F('client__name'))

    def annotate_vendors_count(self):
        vendors_subquery = Vendor.objects.filter(project_vendors=OuterRef('pk')).values('project_vendors').annotate(
            total_vendors=Count('id')).values('total_vendors')

        return self.annotate(total_vendors=Coalesce(Subquery(vendors_subquery), 0))

    def annotate_consultants_count(self):
        consultants_subquery = Consultant.objects.filter(project_consultants=OuterRef('pk')).values('project_consultants').annotate(
            total_consultants=Count('id')).values('total_consultants')

        return self.annotate(total_consultants=Coalesce(Subquery(consultants_subquery), 0))

    def annotate_contractors_count(self):
        contractors_subquery = Contractor.objects.filter(project_contractors=OuterRef('pk')).values('project_contractors').annotate(
            total_contractors=Count('id')).values('total_contractors')

        return self.annotate(total_contractors=Coalesce(Subquery(contractors_subquery), 0))

class ProjectManager(BaseUserManager):
    def get_queryset(self):
        return ProjectQuerySet(self.model, using=self._db).filter(deleted_at__isnull=True)

    def with_trashed(self):
        return ProjectQuerySet(self.model, using=self._db)