from django.db.models import Count, Q
from apps.calls.constants import TRANSFER_STATUS


def calculate_transfer_percentages(calls_qs):
    """
    Bot-agnostic transfer statistics.
    Works on ANY filtered Call queryset.
    """

    stats = calls_qs.aggregate(
        total_calls=Count("id"),
        transferred=Count(
            "id",
            filter=Q(transfer_status=TRANSFER_STATUS.SUCCESSFUL.value),
        ),
        not_transferred=Count(
            "id",
            filter=Q(transfer_status=TRANSFER_STATUS.NOT_TRANSFERRED.value),
        ),
        failed=Count(
            "id",
            filter=Q(transfer_status=TRANSFER_STATUS.FAILED.value),
        ),
    )

    total = stats["total_calls"] or 0

    if total == 0:
        return {
            "transferred_percentage": 0.0,
            "not_transferred_percentage": 0.0,
            "failed_percentage": 0.0,
            "unknown_percentage": 0.0,
        }

    known = (
        stats["transferred"]
        + stats["not_transferred"]
        + stats["failed"]
    )

    unknown = total - known

    return {
        "transferred_percentage": round((stats["transferred"] / total) * 100, 2),
        "not_transferred_percentage": round((stats["not_transferred"] / total) * 100, 2),
        "failed_percentage": round((stats["failed"] / total) * 100, 2),
        "unknown_percentage": round((unknown / total) * 100, 2),
    }
