# worktime/signals.py
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from stamps.models import Stamp as Stamps
#from .models import Stamps
from .tasks import calculate_balance_task

@receiver(post_save, sender=Stamps)
def on_stamp_created(sender, instance, created, **kwargs):
    print(f"DEBUG SIGNAL: Stamp created - id={instance.id}, date={instance.date}, start_date={instance.start_date}, return_date={instance.return_date}")
    
    if instance.date:
        # If stamp has start_date and return_date, calculate for ALL dates in the range
        # Example: start_date=2025-11-13, return_date=2025-11-15
        # Should calculate for: 2025-11-13, 2025-11-14, 2025-11-15
        if instance.start_date and instance.return_date:
            from datetime import timedelta
            
            # Get date range (just the dates, not times)
            start_date = instance.start_date.date() if hasattr(instance.start_date, 'date') else instance.start_date
            return_date = instance.return_date.date() if hasattr(instance.return_date, 'date') else instance.return_date
            
            print(f"DEBUG SIGNAL: Date range detected - start_date={start_date}, return_date={return_date}")
            
            # Calculate for each date in the range (inclusive)
            current_date = start_date
            dates_to_calculate = set()
            
            while current_date <= return_date:
                dates_to_calculate.add(current_date.isoformat())
                print(f"DEBUG SIGNAL: Adding date to calculate: {current_date.isoformat()}")
                current_date += timedelta(days=1)
            
            print(f"DEBUG SIGNAL: Will calculate for {len(dates_to_calculate)} dates: {sorted(dates_to_calculate)}")
            
            # Calculate balance for each date in the range
            for date_iso in sorted(dates_to_calculate):
                print(f"DEBUG SIGNAL: Calculating balance - userId {instance.user_id}, Date {date_iso}")
                calculate_balance_task(instance.user_id, date_iso)
        else:
            # Normal case: calculate only for the stamp's date
            print(f"DEBUG SIGNAL: No date range - calculating only for stamp date. userId {instance.user_id}, Date {instance.date.isoformat()}")
            print(f"DEBUG SIGNAL: start_date={instance.start_date}, return_date={instance.return_date}")
            calculate_balance_task(instance.user_id, instance.date.isoformat())

# Handler for deletion (post_delete)
@receiver(post_delete, sender=Stamps)
def on_stamp_deleted(sender, instance, **kwargs):
    """Triggers recalculation when a stamp is deleted."""
    # The instance still holds user_id and date just before deletion.
    if instance.date:
        # If stamp had start_date and return_date, recalculate for ALL dates in the range
        if instance.start_date and instance.return_date:
            from datetime import timedelta
            
            # Get date range (just the dates, not times)
            start_date = instance.start_date.date() if hasattr(instance.start_date, 'date') else instance.start_date
            return_date = instance.return_date.date() if hasattr(instance.return_date, 'date') else instance.return_date
            
            # Calculate for each date in the range (inclusive)
            current_date = start_date
            dates_to_calculate = set()
            
            while current_date <= return_date:
                dates_to_calculate.add(current_date.isoformat())
                current_date += timedelta(days=1)
            
            # Recalculate balance for each date in the range
            for date_iso in dates_to_calculate:
                calculate_balance_task(instance.user_id, date_iso)
        else:
            # Normal case: recalculate only for the stamp's date
            calculate_balance_task(instance.user_id, instance.date.isoformat())