"""Feed API: posts, likes, comments, upload."""
import os
import uuid
from django.conf import settings
from django.utils import timezone
from rest_framework.views import APIView

from core.models import FeedPost, FeedPostLike, FeedPostComment
from .auth_utils import ok, err
from .permissions import IsAppUser
from .serializers import FeedPostSerializer, FeedCommentSerializer


class FeedPostsView(APIView):
    permission_classes = [IsAppUser]

    def get(self, request):
        page = int(request.query_params.get('page', 1))
        limit = int(request.query_params.get('limit', 20))
        offset = (page - 1) * limit
        total = FeedPost.objects.count()
        posts = FeedPost.objects.all()[offset:offset + limit]
        s = FeedPostSerializer(posts, many=True, context={'request': request})
        return ok(s.data, status=200)

    def post(self, request):
        d = request.data
        post = FeedPost.objects.create(
            user=request.app_user,
            content=d.get('content', ''),
            media=d.get('media', []),
            created_at=timezone.now(),
            updated_at=timezone.now(),
        )
        return ok(FeedPostSerializer(post, context={'request': request}).data,
                  'Post created.', 201)


class FeedLikeView(APIView):
    permission_classes = [IsAppUser]

    def post(self, request, post_id):
        try:
            post = FeedPost.objects.get(id=post_id)
        except FeedPost.DoesNotExist:
            return err('Post not found.', 404)
        like, created = FeedPostLike.objects.get_or_create(
            post=post, user=request.app_user,
            defaults={'created_at': timezone.now()},
        )
        if not created:
            like.delete()
            liked = False
        else:
            liked = True
        count = FeedPostLike.objects.filter(post=post).count()
        return ok({'liked': liked, 'likeCount': count})


class FeedCommentsView(APIView):
    permission_classes = [IsAppUser]

    def get(self, request, post_id):
        comments = FeedPostComment.objects.filter(
            post_id=post_id,
        ).select_related('user').order_by('created_at')
        return ok(FeedCommentSerializer(comments, many=True).data)

    def post(self, request, post_id):
        text = request.data.get('text', '').strip()
        if not text:
            return err('text is required.', 400)
        try:
            post = FeedPost.objects.get(id=post_id)
        except FeedPost.DoesNotExist:
            return err('Post not found.', 404)
        comment = FeedPostComment.objects.create(
            post=post,
            user=request.app_user,
            text=text,
            created_at=timezone.now(),
        )
        return ok(FeedCommentSerializer(comment).data, 'Comment added.', 201)


class FeedMediaUploadView(APIView):
    permission_classes = [IsAppUser]

    def post(self, request):
        file = request.FILES.get('file') or request.FILES.get('media')
        if not file:
            return err('No file provided.', 400)

        ext = os.path.splitext(file.name)[1].lower()
        allowed = {'.jpg', '.jpeg', '.png', '.gif', '.mp4', '.mov', '.webp'}
        if ext not in allowed:
            return err(f'File type {ext} not allowed.', 400)

        upload_dir = os.path.join(settings.MEDIA_ROOT, 'feed')
        os.makedirs(upload_dir, exist_ok=True)
        filename = f'{uuid.uuid4().hex}{ext}'
        path = os.path.join(upload_dir, filename)
        with open(path, 'wb') as f:
            for chunk in file.chunks():
                f.write(chunk)

        url = f'{settings.MEDIA_URL}feed/{filename}'
        return ok({'url': url, 'filename': filename}, 'Uploaded.', 201)
