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


class DailyCallsService:

    @staticmethod
    def get_summary(queryset, start_date, end_date, user=None):
        """
        Reproduce EXACT logic from old daily-calls endpoint.
        """

        start_date = start_date.date()
        end_date = end_date.date()

        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:
                company_tz = timezone.get_default_timezone()

        start_dt = timezone.make_aware(
            datetime.combine(start_date, datetime.min.time()),
            company_tz
        )

        end_dt_exclusive = timezone.make_aware(
            datetime.combine(end_date + timedelta(days=1), datetime.min.time()),
            company_tz
        )

        queryset_in_range = queryset.filter(
            created_at__gte=start_dt,
            created_at__lt=end_dt_exclusive,
        )

        daily_agg = (
            queryset_in_range
            .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")
        )

        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),
            }

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

        return result
