from django.test import TestCase
from django.contrib.auth import get_user_model
from rest_framework.test import APIClient
from rest_framework import status
from django.urls import reverse
from posts.models import Post
from follows.models import FollowUser

User = get_user_model()

class FeedPostsTestCase(TestCase):
    def setUp(self):
        self.client = APIClient()
        self.user = User.objects.create_user(username='user1', email='u1@e.com', password='pw')
        self.followed_user = User.objects.create_user(username='followed', email='f@e.com', password='pw')
        self.unfollowed_user = User.objects.create_user(username='stranger', email='s@e.com', password='pw')

        # Follow relationship
        FollowUser.objects.create(follower=self.user, followed=self.followed_user)

        # Create posts
        self.post_followed = Post.objects.create(
            content='Followed user post', created_by=self.followed_user, audience='PUBLIC'
        )
        self.post_stranger = Post.objects.create(
            content='Stranger post', created_by=self.unfollowed_user, audience='PUBLIC'
        )
        self.post_self = Post.objects.create(
            content='My own post', created_by=self.user, audience='PUBLIC'
        )

    def test_feed_authenticated(self):
        """Authenticated feed should show posts from followed users and self, NOT strangers"""
        self.client.force_authenticate(user=self.user)
        response = self.client.get(reverse('feed_posts'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        contents = [p['content'] for p in response.data['results']]
        self.assertIn('Followed user post', contents)
        self.assertIn('My own post', contents)
        self.assertNotIn('Stranger post', contents)

    def test_feed_unauthenticated(self):
        """Unauthenticated feed should show all public posts (recent)"""
        self.client.logout()
        response = self.client.get(reverse('feed_posts'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        contents = [p['content'] for p in response.data['results']]
        self.assertIn('Followed user post', contents)
        self.assertIn('Stranger post', contents)

    def test_explore_feed(self):
        """Explore feed should show posts from STRANGERS, not followed users or self"""
        self.client.force_authenticate(user=self.user)
        response = self.client.get(reverse('explore_feed'))
        self.assertEqual(response.status_code, status.HTTP_200_OK)

        contents = [p['content'] for p in response.data['results']]
        self.assertIn('Stranger post', contents)
        self.assertNotIn('Followed user post', contents)
        self.assertNotIn('My own post', contents)
