from inquiry.models import Inquiries, Products
from django.db.models import Count
from rest_framework.response import Response
from .serializers import ProductInquiriesReportSerializer


class ProductInquiriesReport:
    def get_top_ten_inquired_products(self, serialize_data=False):
        products = (
            Products.objects.select_related("series", "category")
            .annotate(inquiries_count=Count("product_inquiries"))
            .exclude(inquiries_count=0)
            .order_by("-inquiries_count")[:10]
        )

        if serialize_data:
            serializer = ProductInquiriesReportSerializer(products, many=True)
            return serializer.data

        return products

    def get_most_inquired_product(self, serialize_data=False):
        products = self.get_top_ten_inquired_products()
        most_inquired_product = products.first()

        if serialize_data:
            serializer = ProductInquiriesReportSerializer(
                most_inquired_product, many=False
            )
            return serializer.data

        return products.first()

    def get_category_with_most_inquiries(self):
        most_inquired_categories = (
            Inquiries.objects.values(
                "product__category__sub_category_name",
                "product__category__main_category_name",
            )
            .annotate(inquiry_count=Count("product__category__sub_category_name"))
            .order_by("-inquiry_count")[:3]
        )

        formatted_data = []

        for item in most_inquired_categories:
            formatted_data.append(
                {
                    "main_category": ",".join(
                        item["product__category__main_category_name"]
                    ),
                    "sub_category": item["product__category__sub_category_name"],
                    "inquiry_count": item["inquiry_count"],
                }
            )

        return formatted_data

    def get_top_inquirer(self):
        top_inquirer = (
            Inquiries.objects.values(
                "first_name",
                "last_name",
                "email",
            )
            .annotate(inquiry_count=Count("email"))
            .order_by("-inquiry_count")
            .first()
        )

        return top_inquirer
