from datetime import datetime, timedelta
from django.db.models import Count
from django.db.models.functions import TruncDate
from django.utils import timezone
import pytz
import logging


logger = logging.getLogger(__name__)


class DailyCallsService:

    @staticmethod
    def get_summary(queryset, start_dt, end_dt, user=None):
        """
        Daily calls summary (timezone-safe).
        """

        queryset = queryset.filter(
            created_at__gte=start_dt,
            created_at__lte=end_dt,
        )

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

        daily_agg = (
            queryset
            .annotate(day=TruncDate("created_at", tzinfo=company_tz))
            .values("day")
            .annotate(
                total_calls=Count("id"),
                unique_callers=Count("from_number", distinct=True),
            )
            .order_by("day")
        )

        start_date = start_dt.astimezone(company_tz).date()
        end_date = end_dt.astimezone(company_tz).date()

        days_range = {
            start_date + timedelta(days=i): {"unique": 0, "repetitive": 0}
            for i in range((end_date - start_date).days + 1)
        }

        for row in daily_agg:
            day = row["day"]
            unique = row["unique_callers"] or 0
            total = row["total_calls"] or 0

            days_range[day] = {
                "unique": unique,
                "repetitive": max(total - unique, 0),
            }

        return [
            {
                "date": day.strftime("%b-%d"),
                **days_range[day],
            }
            for day in sorted(days_range)
        ]
