from decimal import Decimal

from django.db.models import Sum

from apps.business.rewards.models import FranchiseMonthlyIncentive, UserBonanzaCounter


def get_user_bonus_metrics(user, month_start):
    """
    Aggregate user bonus counters and monthly franchise incentives for dashboard metrics.

    Returns a normalized dict with all expected dashboard bonanza keys.
    """
    rows = list(
        UserBonanzaCounter.objects.filter(user=user, is_active=True)
        .values("category")
        .annotate(total_quantity=Sum("quantity"), total_amount=Sum("amount"))
    )

    by_category = {
        row["category"]: {
            "quantity": int(row.get("total_quantity") or 0),
            "amount": Decimal(str(row.get("total_amount") or 0)),
        }
        for row in rows
    }

    monthly_sales_incentives = (
        FranchiseMonthlyIncentive.objects.filter(
            user=user,
            is_active=True,
            period_month__gte=month_start,
        ).aggregate(total=Sum("amount"))["total"]
        or Decimal("0.00")
    )

    return {
        "lucky_dip_bonanza": by_category.get(UserBonanzaCounter.Category.LUCKY_DIP_BONANZA, {}).get("quantity", 0),
        "products_bonanzas": by_category.get(UserBonanzaCounter.Category.PRODUCTS_BONANZA, {}).get("quantity", 0),
        "domestic_travel_bonanzas": by_category.get(UserBonanzaCounter.Category.DOMESTIC_TRAVEL_BONANZA, {}).get("quantity", 0),
        "international_travel_bonanzas": by_category.get(UserBonanzaCounter.Category.INTERNATIONAL_TRAVEL_BONANZA, {}).get("quantity", 0),
        "two_wheeler_bonanzas": by_category.get(UserBonanzaCounter.Category.TWO_WHEELER_BONANZA, {}).get("quantity", 0),
        "alkaline_water_device_bonanzas": by_category.get(UserBonanzaCounter.Category.ALKALINE_WATER_DEVICE_BONANZA, {}).get("quantity", 0),
        "gold_bonanzas": by_category.get(UserBonanzaCounter.Category.GOLD_BONANZA, {}).get("quantity", 0),
        "car_fund_bonanzas": by_category.get(UserBonanzaCounter.Category.CAR_FUND_BONANZA, {}).get("quantity", 0),
        "glyminoh_monthly_sales_incentives": monthly_sales_incentives,
    }
