from rest_framework import serializers
from .models import AppointmentSlot, Appointment, SlotTemplate


class SlotTemplateSerializer(serializers.ModelSerializer):
    class Meta:
        model = SlotTemplate
        fields = [
            "id", "weekday", "start_time", "end_time", "slot_duration_minutes",
            "is_online", "meet_link", "location_notes", "is_active",
            "created_at", "updated_at",
        ]
        read_only_fields = ["created_at", "updated_at"]


class AppointmentSlotSerializer(serializers.ModelSerializer):
    """Créneau pour liste publique : disponible ou non."""
    is_available = serializers.BooleanField(read_only=True)

    class Meta:
        model = AppointmentSlot
        fields = [
            "id", "date", "start_time", "end_time",
            "is_online", "meet_link", "location_notes",
            "is_available", "created_at",
        ]
        read_only_fields = ["created_at"]


class AppointmentSlotAdminSerializer(serializers.ModelSerializer):
    """Admin : détail créneau avec infos rendez-vous éventuel."""
    is_available = serializers.BooleanField(read_only=True)
    appointment_guest = serializers.SerializerMethodField()
    appointment_status = serializers.SerializerMethodField()

    class Meta:
        model = AppointmentSlot
        fields = [
            "id", "date", "start_time", "end_time",
            "is_online", "meet_link", "location_notes",
            "is_available", "appointment_guest", "appointment_status",
            "created_at", "created_by", "template",
        ]
        read_only_fields = ["created_at"]

    def get_appointment_guest(self, obj):
        if hasattr(obj, "appointment") and obj.appointment.status not in (Appointment.Status.CANCELLED, Appointment.Status.NO_SHOW):
            return obj.appointment.guest_email
        return None

    def get_appointment_status(self, obj):
        if hasattr(obj, "appointment"):
            return obj.appointment.status
        return None


class AppointmentBookSerializer(serializers.Serializer):
    """Réservation : slot_id + email (obligatoire) + nom optionnel."""
    slot_id = serializers.IntegerField()
    guest_email = serializers.EmailField()
    guest_name = serializers.CharField(required=False, allow_blank=True, default="")


class AppointmentSerializer(serializers.ModelSerializer):
    """Détail rendez-vous (pour liste « mes rendez-vous » et admin)."""
    slot_date = serializers.DateField(source="slot.date", read_only=True)
    slot_start_time = serializers.TimeField(source="slot.start_time", read_only=True)
    slot_end_time = serializers.TimeField(source="slot.end_time", read_only=True)
    slot_is_online = serializers.BooleanField(source="slot.is_online", read_only=True)
    slot_meet_link = serializers.URLField(source="slot.meet_link", read_only=True)
    slot_location_notes = serializers.CharField(source="slot.location_notes", read_only=True)

    class Meta:
        model = Appointment
        fields = [
            "id", "slot", "slot_date", "slot_start_time", "slot_end_time",
            "slot_is_online", "slot_meet_link", "slot_location_notes",
            "user", "guest_email", "guest_name", "status",
            "created_at", "updated_at", "email_sent_at", "confirmed_at", "admin_notes",
        ]
        read_only_fields = ["created_at", "updated_at", "email_sent_at", "confirmed_at"]


class AppointmentAdminSerializer(serializers.ModelSerializer):
    """Admin : édition statut, notes."""
    slot_date = serializers.DateField(source="slot.date", read_only=True)
    slot_start_time = serializers.TimeField(source="slot.start_time", read_only=True)
    slot_end_time = serializers.TimeField(source="slot.end_time", read_only=True)
    slot_is_online = serializers.BooleanField(source="slot.is_online", read_only=True)
    slot_meet_link = serializers.URLField(source="slot.meet_link", read_only=True)

    class Meta:
        model = Appointment
        fields = [
            "id", "slot", "slot_date", "slot_start_time", "slot_end_time",
            "slot_is_online", "slot_meet_link",
            "user", "guest_email", "guest_name", "status",
            "created_at", "updated_at", "email_sent_at", "confirmed_at", "admin_notes",
        ]
        read_only_fields = ["created_at", "updated_at", "email_sent_at", "confirmed_at"]
