# signals.py

from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.db import transaction
from .models import ProfilePackage, GlobalRank, Profile

@receiver(post_save, sender=ProfilePackage)
def update_global_rank_on_package_purchase(sender, instance, created, **kwargs):
    if created:
        update_single_profile_rank(instance.profile)

@receiver(post_delete, sender=ProfilePackage)
def update_global_rank_on_package_delete(sender, instance, **kwargs):
    update_single_profile_rank(instance.profile)

def update_single_profile_rank(profile):
    """একটি নির্দিষ্ট প্রোফাইলের জন্য total_spending আপডেট করে এবং সব র‌্যাঙ্ক রিক্যালকুলেট করে"""
    with transaction.atomic():
        # এই প্রোফাইলের সঠিক total_spending বের করুন
        total_spending = profile.get_total_package_price()
        
        # গ্লোবাল র‌্যাঙ্ক আপডেট বা তৈরি করুন (total_spending সহ)
        GlobalRank.objects.update_or_create(
            profile=profile,
            defaults={
                'total_spending': total_spending
            }
        )
        
        # তারপর সবার র‌্যাঙ্ক পজিশন রিক্যালকুলেট করুন
        recalculate_all_ranks()

def recalculate_all_ranks():
    """সব প্রোফাইলের total_spending অনুযায়ী সঠিক rank পজিশন সেট করে"""
    # প্রথমে নিশ্চিত করুন সব প্রোফাইলের জন্য GlobalRank আছে এবং total_spending সঠিক
    all_profiles = Profile.objects.all()
    for profile in all_profiles:
        total = profile.get_total_package_price()
        GlobalRank.objects.update_or_create(
            profile=profile,
            defaults={'total_spending': total}
        )
    
    # এখন rank পজিশন রিক্যালকুলেট করুন
    all_ranks = GlobalRank.objects.all().order_by('-total_spending')
    
    for index, rank in enumerate(all_ranks, start=1):
        if rank.global_rank != index:
            rank.global_rank = index
            rank.save()