"""
Services module for the cards app.
"""
from django.db.models import Q
from django.db.models import Avg
from django.db.models import Count
from django.shortcuts import get_object_or_404

from .models import Card


def get_cards_with_rating():
    return (
        Card.objects.prefetch_related("user")
        .prefetch_related("ratings")
        .annotate(rating=Avg("ratings__value"))
        .annotate(
            rating_count=Count(
                "ratings",
                filter=Q(ratings__value__isnull=False),
            ),
        )
        .all()
    )


def get_default_card_with_rating(username):
    queryset = (
        Card.objects.prefetch_related("user")
        .prefetch_related("ratings")
        .annotate(rating=Avg("ratings__value"))
        .annotate(
            rating_count=Count(
                "ratings",
                filter=Q(ratings__value__isnull=False),
            ),
        )
        .filter(user__username=username)
        .filter(default=True)
    )

    return get_object_or_404(queryset)
