from rest_framework import serializers
from .models import VendorAIConfig, VendorFAQ, AIChat, AIChatMessage


class VendorFAQSerializer(serializers.ModelSerializer):
    class Meta:
        model = VendorFAQ
        fields = ['id', 'question', 'answer', 'order', 'is_active', 'created_at']
        read_only_fields = ['id', 'created_at']


class VendorAIConfigSerializer(serializers.ModelSerializer):
    faqs = VendorFAQSerializer(many=True, read_only=True)

    class Meta:
        model = VendorAIConfig
        fields = [
            'id', 'business_description', 'policies', 'custom_instructions',
            'suggested_questions', 'is_active', 'faqs', 'created_at', 'updated_at'
        ]
        read_only_fields = ['id', 'created_at', 'updated_at']


class AIChatMessageSerializer(serializers.ModelSerializer):
    class Meta:
        model = AIChatMessage
        fields = ['id', 'role', 'content', 'was_helpful', 'created_at']
        read_only_fields = ['id', 'role', 'content', 'created_at']


class AIChatSerializer(serializers.ModelSerializer):
    messages = AIChatMessageSerializer(many=True, read_only=True)
    message_count = serializers.SerializerMethodField()

    class Meta:
        model = AIChat
        fields = [
            'id', 'session_id', 'started_at', 'ended_at',
            'was_handed_off', 'is_active', 'messages', 'message_count'
        ]

    def get_message_count(self, obj):
        return obj.messages.count()


class AIChatListSerializer(serializers.ModelSerializer):
    message_count = serializers.SerializerMethodField()
    last_message = serializers.SerializerMethodField()

    class Meta:
        model = AIChat
        fields = [
            'id', 'session_id', 'started_at', 'ended_at',
            'was_handed_off', 'is_active', 'message_count', 'last_message'
        ]

    def get_message_count(self, obj):
        return obj.messages.count()

    def get_last_message(self, obj):
        last = obj.messages.exclude(role='system').last()
        if last:
            return {
                'role': last.role,
                'content': last.content[:100],
                'created_at': last.created_at.isoformat()
            }
        return None
