from rest_framework import serializers
from apps.appointments.models import Appointment


class AppointmentSerializer(serializers.ModelSerializer):
    partner_call_id = serializers.SerializerMethodField()
    customer_number = serializers.SerializerMethodField()
    transcript = serializers.SerializerMethodField()
    call_id = serializers.SerializerMethodField()
    
    def get_customer_number(self, obj):
        if obj.call and obj.call.from_number:
            return obj.call.from_number
        return None

    def get_call_id(self, obj):
        if obj.call and obj.call.id:
            return obj.call.id
        return None

    def get_partner_call_id(self, obj):
        if obj.call and obj.call.call_id:
            return obj.call.call_id
        return None
    
    def get_transcript(self, obj):
        if obj.call and obj.call.transcript:
            return obj.call.transcript
        return None

    class Meta:
        model = Appointment
        fields = [
            'id',
            'name',
            'call_id',
            'scheduled_date',
            'offtime',
            'twilio_call_sid',
            'partner_call_id',
            'customer_number',
            'created_at',
            'transcript',
            'bot_type'
        ]
        read_only_fields = ['id', 'created_at', 'updated_at', 'customer_number', 'partner_call_id', 'transcript', 'call_id']


class BookAppointmentInputSerializer(serializers.Serializer):
    """
    Permissive input serializer for webhook payloads. It validates top-level
    'args' and 'call' as dicts but does not enforce strict inner schema so
    small webhook changes won't break validation.
    """
    args = serializers.DictField(child=serializers.CharField(allow_blank=True), required=False)
    call = serializers.DictField(required=False)

class WebhookSuccessSerializer(serializers.Serializer):
    message = serializers.CharField()
