"""
Dashboard serializers for Aimantis hotel management platform.

Provides complete nested serializer architecture for:
- Structure information
- Overview metrics
- Occupancy percentages
- Average rates
- Upcoming events
- Monthly occupancy charts
- Complete dashboard response

All serializers are designed for drf-spectacular compatibility
and frontend-friendly response contracts.
"""

from rest_framework import serializers


class StructureSerializer(serializers.Serializer):
    """Serializer for structure information."""
    id = serializers.IntegerField()
    name = serializers.CharField()


class OverviewSerializer(serializers.Serializer):
    """Serializer for dashboard overview metrics."""
    checkins_today = serializers.IntegerField(
        help_text="Number of bookings checking in today"
    )
    checkouts_today = serializers.IntegerField(
        help_text="Number of bookings checking out today"
    )
    guests_in_structure = serializers.IntegerField(
        help_text="Number of guests currently staying (is_checked_in=True)"
    )
    available_rooms = serializers.IntegerField(
        help_text="Number of available rooms"
    )
    occupied_rooms = serializers.IntegerField(
        help_text="Number of physically occupied rooms"
    )
    total_rooms = serializers.IntegerField(
        help_text="Total number of rooms in structure"
    )
    total_beds = serializers.IntegerField(
        help_text="Total number of beds across all property types"
    )


class OccupancySerializer(serializers.Serializer):
    """Serializer for occupancy percentage metrics."""
    today = serializers.IntegerField(
        min_value=0,
        max_value=100,
        help_text="Occupancy percentage for today"
    )
    next_7_days = serializers.IntegerField(
        min_value=0,
        max_value=100,
        help_text="Average occupancy percentage for next 7 days"
    )
    next_30_days = serializers.IntegerField(
        min_value=0,
        max_value=100,
        help_text="Average occupancy percentage for next 30 days"
    )


class AverageRatesSerializer(serializers.Serializer):
    """Serializer for average nightly rate metrics."""
    today = serializers.FloatField(
        min_value=0,
        help_text="Average nightly rate for today"
    )
    next_7_days = serializers.FloatField(
        min_value=0,
        help_text="Average nightly rate for next 7 days"
    )
    next_30_days = serializers.FloatField(
        min_value=0,
        help_text="Average nightly rate for next 30 days"
    )


class UpcomingEventSerializer(serializers.Serializer):
    """Serializer for a single upcoming event (check-in or check-out)."""
    booking_id = serializers.IntegerField()
    event_type = serializers.CharField(
        help_text="Event type: 'check_in' or 'check_out'"
    )
    guest_name = serializers.CharField()
    channel = serializers.CharField(
        help_text="Normalized channel name (e.g., 'Booking.com', 'Airbnb')"
    )
    nights = serializers.IntegerField()
    amount = serializers.CharField(
        help_text="Booking total price as formatted string"
    )
    date = serializers.CharField(
        help_text="Event date in ISO format (YYYY-MM-DD)"
    )


class MonthlyOccupancySerializer(serializers.Serializer):
    """Serializer for a single month's occupancy data."""
    month = serializers.CharField(
        help_text="Month abbreviation (e.g., 'Jan', 'Feb')"
    )
    year = serializers.CharField(
        help_text="Year as string (e.g., '2026')"
    )
    occupancy = serializers.IntegerField(
        min_value=0,
        max_value=100,
        help_text="Occupancy percentage for the month"
    )


class ChartsSerializer(serializers.Serializer):
    """Serializer for chart data."""
    monthly_occupancy = MonthlyOccupancySerializer(
        many=True,
        help_text="Monthly occupancy data for last 12 months"
    )


class DashboardResponseSerializer(serializers.Serializer):
    """Complete dashboard response serializer."""
    date = serializers.DateField(
        help_text="Current date for the dashboard data"
    )
    structure = StructureSerializer(
        help_text="Selected structure information"
    )
    overview = OverviewSerializer()
    occupancy = OccupancySerializer()
    average_rates = AverageRatesSerializer()
    upcoming_events = UpcomingEventSerializer(many=True)
    charts = ChartsSerializer()
