from rest_framework import serializers
from .models import Notification, NotificationPreference, UserNotificationPreference, CategoryNotificationPreference, FollowRequest
from users.serializers import UserSerializer
from categories.serializers import CategorySerializer


class NotificationSerializer(serializers.ModelSerializer):
    sender = UserSerializer(read_only=True)
    recipient = UserSerializer(read_only=True)
    related_post_id = serializers.IntegerField(source='related_post.id', read_only=True, allow_null=True)
    related_comment_id = serializers.IntegerField(source='related_comment.id', read_only=True, allow_null=True)
    related_category_id = serializers.IntegerField(source='related_category.id', read_only=True, allow_null=True)
    follow_request_id = serializers.SerializerMethodField()

    class Meta:
        model = Notification
        fields = [
            'id',
            'recipient',
            'sender',
            'notification_type',
            'content',
            'related_post_id',
            'related_comment_id',
            'related_category_id',
            'follow_request_id',
            'is_read',
            'created_at'
        ]
        read_only_fields = ['id', 'created_at']

    def get_follow_request_id(self, obj):
        if obj.notification_type == 'follow_request' and obj.sender:
            try:
                request = FollowRequest.objects.get(
                    requester=obj.sender,
                    target=obj.recipient,
                    status='pending'
                )
                return request.id
            except FollowRequest.DoesNotExist:
                return None
        return None


class NotificationPreferenceSerializer(serializers.ModelSerializer):
    class Meta:
        model = NotificationPreference
        fields = [
            'notify_on_follow',
            'notify_on_like',
            'notify_on_comment',
            'notify_on_followed_user_post',
            'notify_on_followed_category_post'
        ]


class UserNotificationPreferenceSerializer(serializers.ModelSerializer):
    target_user = UserSerializer(read_only=True)

    class Meta:
        model = UserNotificationPreference
        fields = ['id', 'user', 'target_user', 'notify_on_new_post', 'created_at']
        read_only_fields = ['id', 'user', 'created_at']


class CategoryNotificationPreferenceSerializer(serializers.ModelSerializer):
    category = CategorySerializer(read_only=True)

    class Meta:
        model = CategoryNotificationPreference
        fields = ['id', 'user', 'category', 'notify_on_new_post', 'created_at']
        read_only_fields = ['id', 'user', 'created_at']


class FollowRequestSerializer(serializers.ModelSerializer):
    requester = UserSerializer(read_only=True)
    target = UserSerializer(read_only=True)

    class Meta:
        model = FollowRequest
        fields = ['id', 'requester', 'target', 'status', 'created_at', 'updated_at']
        read_only_fields = ['id', 'requester', 'target', 'created_at', 'updated_at']
