from rest_framework import serializers

from blog.models import PCategory, Post, PComment
from blog.tasks import send_comment_notification_email


class CateSerializer(serializers.ModelSerializer):
    parent = serializers.StringRelatedField()  # ID yerine __str__ metodundaki değeri döndürür

    class Meta:
        model = PCategory
        fields = ['title', 'parent', 'is_active', 'created_at', 'order', 'slug', 'image', 'keywords', 'description']




class CommentSerializer(serializers.ModelSerializer):
    child = serializers.SerializerMethodField()
    user = serializers.StringRelatedField(read_only=True)

    class Meta:
        model = PComment
        fields = ['id', 'user', 'post', 'title', 'body', 'created_at', 'slug', 'parent', 'child']
        read_only_fields = ['slug', 'created_at', 'user']

    def get_child(self, obj):
        # Sadece aktif alt yorumları getir
        children = obj.child.filter(is_active=True).order_by('created_at')
        return CommentSerializer(children, many=True).data
    
    def create(self, validated_data):
        # Kullanıcıyı request'ten al
        request = self.context.get('request')
        if request and hasattr(request, 'user'):
            validated_data['user'] = request.user
            
        instance = super().create(validated_data)
        
        # Celery task'ini tetikle
        # Kullanıcı email'i varsa al, yoksa username kullan
        user_email = instance.user.email if instance.user.email else instance.user.username
        
        send_comment_notification_email.delay(
            comment_title=instance.title,
            comment_body=instance.body,
            post_title=instance.post.title,
            user_email=user_email
        )
        
        return instance


class PostSerializer(serializers.ModelSerializer):
    categories = CateSerializer(read_only=True, many=True)
    comments = serializers.SerializerMethodField()
    image = serializers.SerializerMethodField()
    thumb = serializers.SerializerMethodField()

    class Meta:
        model = Post
        fields = ['id','title', 'content', 'categories', 'keywords',  'image', 'thumb', 'video',
                  'slug', 'created_at', 'updated_at', 'is_active', 'is_front', 'comments']
        # fields = '__all__'

    def get_image(self, obj):
        if obj.image:
            # Sadece path kısmını döndür (media/ ile başlayan kısım)
            url = obj.image.url
            # URL'de domain varsa çıkar, yoksa olduğu gibi döndür
            if 'http://' in url or 'https://' in url:
                # URL'den sadece path kısmını al
                from urllib.parse import urlparse
                parsed = urlparse(url)
                return parsed.path
            return url
        return None

    def get_thumb(self, obj):
        if obj.thumb:
            # Sadece path kısmını döndür (media/ ile başlayan kısım)
            url = obj.thumb.url
            # URL'de domain varsa çıkar, yoksa olduğu gibi döndür
            if 'http://' in url or 'https://' in url:
                # URL'den sadece path kısmını al
                from urllib.parse import urlparse
                parsed = urlparse(url)
                return parsed.path
            return url
        return None

    def get_comments(self, obj):
        # Sadece ana yorumları (parent=None) ve aktif olanları getir
        comments = obj._post.filter(parent__isnull=True, is_active=True).order_by('-created_at')
        return CommentSerializer(comments, many=True).data


class PostSYalinerializer(serializers.ModelSerializer):
    class Meta:
        model = Post
        fields = ['slug', ]
        # fields = '__all__'


class CategorySerializer(serializers.ModelSerializer):

    posts = PostSYalinerializer(source='c_categories', read_only=True, many=True)
    child = serializers.SerializerMethodField()

    class Meta:
        model = PCategory
        fields = ['title', 'parent', 'is_active', 'created_at', 'order', 'slug', 'image', 'keywords', 'description',
                  'posts', 'child']

    def get_child(self, obj):
        serializer = self.__class__(obj.child.all(), many=True, context=self.context)
        return serializer.data


class CategoryPostSerializer(serializers.ModelSerializer):

    posts = serializers.SerializerMethodField()
    child = serializers.SerializerMethodField()

    class Meta:
        model = PCategory
        fields = ['title', 'parent', 'is_active', 'created_at', 'order', 'slug', 'image', 'keywords', 'description',
                  'posts', 'child']

    def get_posts(self, obj):
        # Pagination context'ini al
        paginator = self.context.get('paginator')
        request = self.context.get('request')

        posts = obj.c_categories.all()

        if paginator and request:
            # Pagination uygula
            paginated_posts = paginator.paginate_queryset(posts, request)
            serializer = PostSerializer(paginated_posts, many=True, context=self.context)
            return {
                'results': serializer.data,
                'count': posts.count(),
                'next': paginator.get_next_link(),
                'previous': paginator.get_previous_link(),
            }
        else:
            # Pagination yoksa normal döndür
            serializer = PostSerializer(posts, many=True, context=self.context)
            return serializer.data

    def get_child(self, obj):
        serializer = self.__class__(obj.child.all(), many=True, context=self.context)
        return serializer.data