from rest_framework import serializers
from .models import MentoringThread, MentoringMessage, AdminMentorThread, AdminMentorMessage


class MentoringMessageSerializer(serializers.ModelSerializer):
    sender_name = serializers.SerializerMethodField()

    class Meta:
        model = MentoringMessage
        fields = ['id', 'thread', 'sender', 'sender_name', 'content', 'is_from_mentor', 'student_can_reply', 'created_at']
        read_only_fields = ['id', 'thread', 'sender', 'sender_name', 'is_from_mentor', 'created_at']

    def get_sender_name(self, obj):
        if obj.sender:
            return f"{obj.sender.first_name or ''} {obj.sender.last_name or ''}".strip() or obj.sender.email
        return "—"


class MentoringThreadSerializer(serializers.ModelSerializer):
    messages = MentoringMessageSerializer(many=True, read_only=True)
    student_email = serializers.EmailField(source='student.email', read_only=True)
    mentor_email = serializers.EmailField(source='mentor.email', read_only=True, allow_null=True)
    document_type_display = serializers.CharField(source='get_document_type_display', read_only=True)

    class Meta:
        model = MentoringThread
        fields = [
            'id', 'student', 'student_email', 'mentor', 'mentor_email',
            'document_type', 'document_type_display', 'document_id',
            'status', 'grade', 'messages',
            'created_at', 'updated_at',
        ]
        read_only_fields = ['id', 'student', 'created_at', 'updated_at']


class MentoringThreadListSerializer(serializers.ModelSerializer):
    student_email = serializers.EmailField(source='student.email', read_only=True)
    document_type_display = serializers.CharField(source='get_document_type_display', read_only=True)

    class Meta:
        model = MentoringThread
        fields = ['id', 'student', 'student_email', 'document_type', 'document_type_display', 'document_id', 'status', 'grade', 'updated_at']


# --- Discussion Admin–Mentor ---
class AdminMentorMessageSerializer(serializers.ModelSerializer):
    sender_name = serializers.SerializerMethodField()

    class Meta:
        model = AdminMentorMessage
        fields = ['id', 'thread', 'sender', 'sender_name', 'content', 'created_at']
        read_only_fields = ['id', 'thread', 'sender', 'sender_name', 'created_at']

    def get_sender_name(self, obj):
        if obj.sender:
            return f"{obj.sender.first_name or ''} {obj.sender.last_name or ''}".strip() or obj.sender.email
        return "—"


class AdminMentorThreadSerializer(serializers.ModelSerializer):
    messages = AdminMentorMessageSerializer(many=True, read_only=True)
    mentor_email = serializers.EmailField(source='mentor.email', read_only=True)
    mentor_name = serializers.SerializerMethodField()
    admin_email = serializers.EmailField(source='admin_user.email', read_only=True)

    class Meta:
        model = AdminMentorThread
        fields = ['id', 'admin_user', 'admin_email', 'mentor', 'mentor_email', 'mentor_name', 'messages', 'created_at', 'updated_at']
        read_only_fields = ['id', 'admin_user', 'mentor', 'created_at', 'updated_at']

    def get_mentor_name(self, obj):
        if obj.mentor:
            return f"{obj.mentor.first_name or ''} {obj.mentor.last_name or ''}".strip() or obj.mentor.email
        return "—"


class AdminMentorThreadListSerializer(serializers.ModelSerializer):
    mentor_email = serializers.EmailField(source='mentor.email', read_only=True)
    mentor_name = serializers.SerializerMethodField()

    class Meta:
        model = AdminMentorThread
        fields = ['id', 'mentor', 'mentor_email', 'mentor_name', 'updated_at']

    def get_mentor_name(self, obj):
        if obj.mentor:
            return f"{obj.mentor.first_name or ''} {obj.mentor.last_name or ''}".strip() or obj.mentor.email
        return "—"
