from django.contrib import admin
from .models import Hotel, RoomType, HotelBooking, RoomTypeAvailability, RoomTypeImage, SeasonalPricing


# Hotel Admin
from django import forms

class HotelAdminForm(forms.ModelForm):
    # Make these optional in the form; we enforce them in clean() if not syncing
    name = forms.CharField(required=False)
    city = forms.CharField(required=False)
    address = forms.CharField(required=False)
    
    class Meta:
        model = Hotel
        fields = '__all__'

    def clean(self):
        cleaned_data = super().clean()
        pms_url = cleaned_data.get("pms_sync_url")
        
        # If no PMS URL is provided, ensure standard fields are present
        if not pms_url:
            if not cleaned_data.get("name"):
                self.add_error("name", "This field is required.")
            if not cleaned_data.get("city"):
                self.add_error("city", "This field is required.")
            if not cleaned_data.get("address"):
                self.add_error("address", "This field is required.")
        
        return cleaned_data

@admin.register(Hotel)
class HotelAdmin(admin.ModelAdmin):
    form = HotelAdminForm
    list_display = (
        "id",
        "name",
        "branch",
        "pms_id",
        "city",
        "rating",
        "owner",
        "created_at",
    )
    list_filter = ("city", "rating", "branch")
    search_fields = ("name", "branch", "category")
    ordering = ("-created_at",)
    
    fieldsets = (
        ("PMS Configuration", {
            "fields": ("pms_sync_url", "pms_sync_token", "pms_hotel_id", "pms_branch_id", "pms_id")
        }),
        ("Hotel Details", {
            "fields": ("owner", "name", "branch", "city", "address", "description", "rating", "amenities", "images")
        }),
        ("Settings", {
            "fields": ("checkin_time", "checkout_time", "is_active")
        }),
    )

    def save_model(self, request, obj, form, change):
        super().save_model(request, obj, form, change)
        
        # Trigger PMS Sync if URL is provided
        if obj.pms_sync_url:
            from .pms_sync import sync_one_hotel
            from django.contrib import messages
            
            token = obj.pms_sync_token or ""
            success, msg = sync_one_hotel(obj, obj.pms_sync_url, token, pms_hotel_id=obj.pms_hotel_id, pms_branch_id=obj.pms_branch_id)
            
            if success:
                messages.success(request, f"Successfully synced with PMS: {msg}")
            else:
                messages.error(request, f"Failed to sync with PMS: {msg}")


# Room Type Admin

class RoomTypeImageInline(admin.TabularInline):
    model = RoomTypeImage
    extra = 1

class SeasonalPricingInline(admin.TabularInline):
    model = SeasonalPricing
    extra = 1

@admin.register(RoomType)
class RoomTypeAdmin(admin.ModelAdmin):
    inlines = [RoomTypeImageInline, SeasonalPricingInline]
    list_display = (
        "id",
        "hotel",
        "name",
        "price",
        "weekend_price",
        "demand_trigger_occupancy",
        "total_rooms",
    )
    list_filter = ("hotel",)
    search_fields = ("hotel__name", "name")
    fieldsets = (
        ("Basic Info", {
            "fields": ("hotel", "pms_id", "name", "branch", "total_rooms")
        }),
        ("Pricing Configuration", {
            "fields": ("price", "weekend_price")
        }),
        ("Demand Based Pricing", {
            "fields": ("demand_trigger_occupancy", "demand_price_multiplier"),
            "description": "Adjust prices dynamically when available rooms are low."
        })
    )

# Room Type Availability Admin
@admin.register(RoomTypeAvailability)
class RoomTypeAvailabilityAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "room_type",
        "date",
        "available_rooms",
    )
    list_filter = ("room_type", "date")
    search_fields = ("room_type__name",)


# Hotel Booking Admin

@admin.register(HotelBooking)
class HotelBookingAdmin(admin.ModelAdmin):
    list_display = (
        "id",
        "user",
        "hotel",
        "room_type",
        "check_in",
        "check_out",
        "rooms_booked",
        "total_amount",
        "status",
        "created_at",
    )
    list_filter = ("status", "hotel")
    search_fields = ("user__username", "hotel__name")
    ordering = ("-created_at",)
