import pytz
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
from django.db.models import Count
from django.utils import timezone
from django.db.models.functions import TruncHour
from apps.calls.serializers import DateRangeSerializer
from apps.calls.utils import get_date_range_from_request
import logging


logger = logging.getLogger(__name__)


class HourlyCallsMixin:
    """
    Mixin for call statistics endpoints.
    """

    @action(detail=False, methods=['get'], url_path='hourly-calls')
    def hourly_calls(self, request):
        start_dt, end_dt = get_date_range_from_request(
            request,
            DateRangeSerializer
        )

        qs = (
            self.filter_queryset(self.get_queryset())
            .filter(created_at__gte=start_dt, created_at__lte=end_dt)
        )

        company_tz = timezone.get_default_timezone()
        user = request.user

        if (getattr(user, "active_company", None) and
                getattr(user.active_company, "timezone", None)):
            try:
                company_tz = pytz.timezone(user.active_company.timezone)
            except Exception as exc:
                logger.warning("Invalid company timezone: %s", exc)

        hourly_agg = (
            qs.annotate(
                local_hour=TruncHour("created_at", tzinfo=company_tz)
            )
            .values("local_hour")
            .annotate(calls=Count("id"))
            .order_by("local_hour")
        )

        hours_range = {h: 0 for h in range(24)}

        for row in hourly_agg:
            hour = row["local_hour"].hour
            hours_range[hour] = row["calls"]

        result = [
            {"time": f"{hour:02d}:00", "calls": calls}
            for hour, calls in hours_range.items()
        ]

        return Response({"hourly_calls": result}, status=status.HTTP_200_OK)
