from rest_framework import serializers

from .models import (
    ClassAttendanceLog,
    ClassBooking,
    ClassSession,
    ClassType,
    RecurringClassTemplate,
    Room,
)


class ClassTypeSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClassType
        fields = [
            "id",
            "name",
            "description",
            "category",
            "default_duration_minutes",
            "default_capacity",
            "max_participants",
            "required_equipment",
            "color_hex",
            "difficulty_level",
            "is_active",
        ]


class RoomSerializer(serializers.ModelSerializer):
    location_name = serializers.CharField(source="location.name", read_only=True, default=None)

    class Meta:
        model = Room
        fields = [
            "id",
            "name",
            "location",
            "location_name",
            "capacity",
            "description",
            "amenities",
            "room_type",
            "status",
            "equipment_available",
            "notes",
            "is_active",
        ]


class ClassSessionSerializer(serializers.ModelSerializer):
    class_type_name = serializers.CharField(source="class_type.name", read_only=True)
    class_type_color = serializers.CharField(source="class_type.color_hex", read_only=True)
    instructor_name = serializers.SerializerMethodField()
    room_name = serializers.CharField(source="room.name", read_only=True, default=None)

    class Meta:
        model = ClassSession
        fields = [
            "id",
            "short_id",
            "class_type",
            "class_type_name",
            "class_type_color",
            "instructor",
            "instructor_name",
            "room",
            "room_name",
            "location",
            "title",
            "description",
            "start_time",
            "end_time",
            "capacity",
            "enrolled_count",
            "waitlist_count",
            "status",
            "recurrence_type",
            "allow_waitlist",
            "notes",
            "is_recurring",
            "recurrence_rule",
            "created_at",
        ]
        read_only_fields = ["id", "short_id", "enrolled_count", "waitlist_count", "created_at"]

    def get_instructor_name(self, obj):
        return obj.instructor.get_full_name() if obj.instructor else None


class CreateClassSessionSerializer(serializers.ModelSerializer):
    class Meta:
        model = ClassSession
        fields = [
            "class_type",
            "instructor",
            "room",
            "location",
            "title",
            "description",
            "start_time",
            "end_time",
            "capacity",
            "is_recurring",
            "recurrence_rule",
            "recurrence_type",
            "allow_waitlist",
            "notes",
            "status",
        ]


class ClassBookingSerializer(serializers.ModelSerializer):
    member_name = serializers.SerializerMethodField()
    class_title = serializers.CharField(source="class_session.title", read_only=True)
    class_start_time = serializers.DateTimeField(source="class_session.start_time", read_only=True)
    instructor_name = serializers.SerializerMethodField()

    class Meta:
        model = ClassBooking
        fields = [
            "id",
            "short_id",
            "class_session",
            "class_title",
            "class_start_time",
            "member",
            "member_name",
            "instructor_name",
            "status",
            "booked_at",
            "cancelled_at",
            "checked_in_at",
            "waitlist_position",
        ]
        read_only_fields = ["id", "short_id", "booked_at", "cancelled_at", "checked_in_at"]

    def get_member_name(self, obj):
        if obj.member and obj.member.user:
            return obj.member.user.get_full_name()
        return str(obj.member) if obj.member else None

    def get_instructor_name(self, obj):
        if obj.class_session and obj.class_session.instructor:
            return obj.class_session.instructor.get_full_name()
        return None


class MemberAvailableClassSerializer(serializers.ModelSerializer):
    class_type_name = serializers.CharField(source="class_type.name", read_only=True)
    class_type_color = serializers.CharField(source="class_type.color_hex", read_only=True)
    instructor_name = serializers.SerializerMethodField()
    room_name = serializers.CharField(source="room.name", read_only=True, default=None)
    booking_status = serializers.SerializerMethodField()
    booking_id = serializers.SerializerMethodField()
    is_full = serializers.SerializerMethodField()

    class Meta:
        model = ClassSession
        fields = [
            "id",
            "short_id",
            "class_type",
            "class_type_name",
            "class_type_color",
            "instructor",
            "instructor_name",
            "room",
            "room_name",
            "title",
            "description",
            "start_time",
            "end_time",
            "capacity",
            "enrolled_count",
            "waitlist_count",
            "status",
            "allow_waitlist",
            "booking_status",
            "booking_id",
            "is_full",
            "recurrence_type",
            "is_recurring",
            "recurrence_rule",
        ]

    def get_instructor_name(self, obj):
        return obj.instructor.get_full_name() if obj.instructor else None

    def get_booking_status(self, obj):
        return getattr(obj, "_booking_status", None)

    def get_booking_id(self, obj):
        bid = getattr(obj, "_booking_id", None)
        return str(bid) if bid else None

    def get_is_full(self, obj):
        return obj.enrolled_count >= obj.capacity


class BookClassSerializer(serializers.Serializer):
    """Used by members to book a class."""
    class_session_id = serializers.UUIDField()


class ClassAttendanceLogSerializer(serializers.ModelSerializer):
    member_name = serializers.SerializerMethodField()

    class Meta:
        model = ClassAttendanceLog
        fields = [
            "id",
            "class_session",
            "member",
            "member_name",
            "check_in_time",
            "check_out_time",
            "method",
        ]

    def get_member_name(self, obj):
        return str(obj.member) if obj.member else None


class RecurringClassTemplateSerializer(serializers.ModelSerializer):
    class_type_name = serializers.CharField(source="class_type.name", read_only=True)
    instructor_name = serializers.SerializerMethodField()

    class Meta:
        model = RecurringClassTemplate
        fields = [
            "id",
            "class_type",
            "class_type_name",
            "instructor",
            "instructor_name",
            "room",
            "location",
            "day_of_week",
            "start_time",
            "end_time",
            "capacity",
            "is_active",
            "effective_from",
            "effective_until",
        ]

    def get_instructor_name(self, obj):
        return obj.instructor.get_full_name() if obj.instructor else None
