from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import User, UserProfile, Donation
from django.db.models import Sum
from django.core.exceptions import ObjectDoesNotExist

@receiver(post_save, sender=User)
def create_user_profile(sender, instance, created, **kwargs):
    """Ensure every user has a profile, creating one if it doesn't exist"""
    if created:
        UserProfile.objects.get_or_create(user=instance)

@receiver(post_save, sender=Donation)
def update_user_profile(sender, instance, created, **kwargs):
    """Update user's total donations when a new donation is made"""
    if created and instance.payment_status == 'completed':
        try:
            profile = UserProfile.objects.get(user=instance.user)
            # Calculate sum of all completed donations
            total = Donation.objects.filter(
                user=instance.user,
                payment_status='completed'
            ).aggregate(total=Sum('amount'))['total'] or 0
            profile.total_donated = total
            profile.save()
        except ObjectDoesNotExist:
            # Create profile if it doesn't exist (shouldn't happen due to first signal)
            profile = UserProfile.objects.create(
                user=instance.user,
                total_donated=instance.amount if instance.payment_status == 'completed' else 0
            )