"""DRF serializers for all Narinest app models."""
from rest_framework import serializers

from core.models import (
    AppUser, Consultation, DeviceToken, FeedPost, FeedPostComment,
    FeedPostLike, KnowledgeContent, KnowledgeTopic, Notification,
    PeriodLog, PregnancyTracking, UserFeedback, UserOnboarding, UserSetting,
)


# ── Auth / User ───────────────────────────────────────────────────────────────

class UserPublicSerializer(serializers.ModelSerializer):
    """Minimal user info safe to expose in lists (doctors, etc.)."""
    class Meta:
        model = AppUser
        fields = ['id', 'name', 'email', 'role', 'profile_image', 'bio',
                  'phone', 'status']


class UserProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = AppUser
        fields = [
            'id', 'name', 'email', 'phone', 'address', 'date_of_birth',
            'age', 'role', 'profile_image', 'bio', 'cycle_length_days',
            'last_period_date', 'is_pregnant', 'health_conditions',
            'status', 'created_at',
        ]
        read_only_fields = ['id', 'email', 'role', 'status', 'created_at']


class UserOnboardingSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserOnboarding
        fields = [
            'id', 'is_married', 'first_period_age', 'last_period_first_day',
            'is_planning_baby', 'created_at', 'updated_at',
        ]


# ── Period ────────────────────────────────────────────────────────────────────

class PeriodLogSerializer(serializers.ModelSerializer):
    class Meta:
        model = PeriodLog
        fields = [
            'id', 'start_date', 'end_date', 'symptoms', 'mood',
            'flow_intensity', 'notes', 'created_at', 'updated_at',
        ]


# ── Pregnancy ─────────────────────────────────────────────────────────────────

class PregnancySerializer(serializers.ModelSerializer):
    class Meta:
        model = PregnancyTracking
        fields = [
            'id', 'start_date', 'due_date', 'current_week', 'notes',
            'last_checkup_date', 'status', 'created_at', 'updated_at',
        ]


# ── Consultation ──────────────────────────────────────────────────────────────

class ConsultationSerializer(serializers.ModelSerializer):
    user_name = serializers.CharField(source='user.name', read_only=True)
    doctor_name = serializers.CharField(source='doctor.name', read_only=True)
    doctor_profile_image = serializers.CharField(
        source='doctor.profile_image', read_only=True,
    )

    class Meta:
        model = Consultation
        fields = [
            'id', 'user_id', 'doctor_id', 'user_name', 'doctor_name',
            'doctor_profile_image', 'topic', 'chat_history',
            'appointment_time', 'status', 'prescription_url',
            'notes', 'rating', 'created_at', 'updated_at',
        ]


# ── Feed ──────────────────────────────────────────────────────────────────────

class FeedCommentSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='user.name', read_only=True)
    author_image = serializers.CharField(source='user.profile_image', read_only=True)

    class Meta:
        model = FeedPostComment
        fields = ['id', 'user_id', 'author_name', 'author_image', 'text', 'created_at']


class FeedPostSerializer(serializers.ModelSerializer):
    author_name = serializers.CharField(source='user.name', read_only=True)
    author_image = serializers.CharField(source='user.profile_image', read_only=True)
    like_count = serializers.SerializerMethodField()
    comment_count = serializers.SerializerMethodField()
    liked_by_me = serializers.SerializerMethodField()
    comments = FeedCommentSerializer(
        source='feedpostcomment_set', many=True, read_only=True,
    )

    class Meta:
        model = FeedPost
        fields = [
            'id', 'user_id', 'author_name', 'author_image', 'content',
            'media', 'like_count', 'comment_count', 'liked_by_me',
            'comments', 'created_at', 'updated_at',
        ]

    def get_like_count(self, obj):
        return FeedPostLike.objects.filter(post=obj).count()

    def get_comment_count(self, obj):
        return FeedPostComment.objects.filter(post=obj).count()

    def get_liked_by_me(self, obj):
        request = self.context.get('request')
        if request and hasattr(request, 'app_user'):
            return FeedPostLike.objects.filter(
                post=obj, user=request.app_user,
            ).exists()
        return False


# ── Notifications ─────────────────────────────────────────────────────────────

class NotificationSerializer(serializers.ModelSerializer):
    class Meta:
        model = Notification
        fields = ['id', 'title', 'message', 'type', 'is_read',
                  'action_url', 'created_at']


# ── Settings ──────────────────────────────────────────────────────────────────

class UserSettingSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserSetting
        fields = ['id', 'language', 'notifications_enabled',
                  'created_at', 'updated_at']


# ── Knowledge ─────────────────────────────────────────────────────────────────

class KnowledgeContentSerializer(serializers.ModelSerializer):
    topic_title = serializers.CharField(source='topic.title', read_only=True)

    class Meta:
        model = KnowledgeContent
        fields = ['id', 'topic_id', 'topic_title', 'title', 'content',
                  'status', 'created_at', 'updated_at']


class KnowledgeTopicSerializer(serializers.ModelSerializer):
    contents = KnowledgeContentSerializer(
        source='knowledgecontent_set', many=True, read_only=True,
    )

    class Meta:
        model = KnowledgeTopic
        fields = ['id', 'title', 'description', 'status', 'contents',
                  'created_at', 'updated_at']


# ── Admin ─────────────────────────────────────────────────────────────────────

class UserFeedbackSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserFeedback
        fields = ['id', 'user_id', 'feedback_type', 'message',
                  'rating', 'status', 'created_at']
