from rest_framework import serializers
from apps.appointments.models import Appointment
from django.utils.dateparse import parse_datetime
from django.utils import timezone


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()

class GHLAppointmentInputSerializer(serializers.Serializer):
    company_id = serializers.CharField()
    customer_name = serializers.CharField(required=False, allow_blank=True)
    customer_phone = serializers.CharField(required=False, allow_blank=True)
    appointment_datetime = serializers.CharField()
    booking_type = serializers.IntegerField()

    def validate_appointment_datetime(self, value):
        dt = parse_datetime(value)
        if not dt:
            raise serializers.ValidationError("Invalid datetime format")
        if timezone.is_naive(dt):
            dt = timezone.make_aware(dt, timezone.utc)
        return dt
