from datetime import timedelta
from decimal import Decimal

from django.db.models.signals import post_save
from django.dispatch import receiver

from hotel.models import HotelBooking

from .models import CommissionConfig, Payment, Settlement

@receiver(post_save, sender=Payment)
def generate_settlement_on_payment_completion(sender, instance, created, **kwargs):
    if instance.status == "completed" and instance.content_type.model == "hotelbooking":
        booking = instance.content_object
        if isinstance(booking, HotelBooking):
            # Check if a settlement already exists
            if hasattr(booking, 'settlement'):
                return
            
            # Get hotel commission. Default 15% if not configured
            try:
                commission_config = booking.hotel.commission_config
                commission_rate = commission_config.percentage
            except CommissionConfig.DoesNotExist:
                # Get or Create default config
                commission_config, _ = CommissionConfig.objects.get_or_create(
                    hotel=booking.hotel,
                    defaults={'percentage': Decimal('15.00')}
                )
                commission_rate = commission_config.percentage
            
            total_amount = Decimal(str(instance.amount))
            commission_amount = (total_amount * commission_rate) / Decimal('100.00')
            settlement_amount = total_amount - commission_amount

            # Settlement date = checkout date + 1 day
            scheduled_for = booking.check_out + timedelta(days=1)

            Settlement.objects.create(
                hotel=booking.hotel,
                booking=booking,
                total_booking_amount=total_amount,
                commission_amount=commission_amount,
                settlement_amount=settlement_amount,
                status="pending",
                scheduled_for=scheduled_for,
            )
