from django.db import transaction
from django.db.models import F
from django.utils.timezone import now
from datetime import timedelta

from .models import RoomTypeAvailability


def generate_room_availability(room_type, months=6):
    start = now().date()
    end = start + timedelta(days=months * 30)

    bulk = []
    for i in range((end - start).days):
        bulk.append(
            RoomTypeAvailability(
                room_type=room_type,
                date=start + timedelta(days=i),
                available_rooms=room_type.total_rooms
            )
        )

    RoomTypeAvailability.objects.bulk_create(bulk)


@transaction.atomic
def block_rooms(room_type, check_in, check_out, rooms_required):
    qs = RoomTypeAvailability.objects.select_for_update().filter(
        room_type=room_type,
        date__gte=check_in,
        date__lt=check_out
    )

    if qs.count() != (check_out - check_in).days:
        raise Exception("Availability missing")

    for day in qs:
        if day.available_rooms < rooms_required:
            raise Exception("Not enough rooms available")

    qs.update(available_rooms=F("available_rooms") - rooms_required)
