"""Tests for public/private and online/offline profile visibility."""
from django.test import TestCase
from django.urls import reverse

from accounts.models import User
from companies.models import Company
from seekers.models import SeekerProfile
from subscriptions.carousel import carousel_companies_queryset, carousel_seekers_queryset


class ProfileVisibilityTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.seeker_user = User.objects.create_user(
            username='vis_seeker',
            email='vis-seeker@test.com',
            password='testpass123',
            role=User.Role.SEEKER,
        )
        cls.seeker = SeekerProfile.objects.create(
            user=cls.seeker_user,
            slug='vis-seeker',
            full_name='Visibility Seeker',
            headline='Engineer',
            category='IT',
            location='Lusaka',
            is_public=True,
            is_online=True,
        )

        cls.employer = User.objects.create_user(
            username='vis_employer',
            email='vis-employer@test.com',
            password='testpass123',
            role=User.Role.COMPANY,
        )
        cls.company = Company.objects.create(
            name='Visibility Co',
            slug='visibility-co',
            initials='VC',
            industry='Tech',
            location='Lusaka',
            description='Test company',
            owner=cls.employer,
            is_public=True,
            is_online=True,
        )

    def test_private_seeker_hidden_from_directory(self):
        self.seeker.is_public = False
        self.seeker.save(update_fields=['is_public'])
        response = self.client.get(reverse('seekers:list'))
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, 'Visibility Seeker')

    def test_seeker_owner_can_view_private_profile(self):
        self.seeker.is_public = False
        self.seeker.save(update_fields=['is_public'])
        self.client.login(username='vis_seeker', password='testpass123')
        response = self.client.get(reverse('seekers:detail', kwargs={'slug': self.seeker.slug}))
        self.assertEqual(response.status_code, 200)

    def test_private_company_hidden_from_directory(self):
        self.company.is_public = False
        self.company.save(update_fields=['is_public'])
        response = self.client.get(reverse('companies:list'))
        self.assertEqual(response.status_code, 200)
        self.assertNotContains(response, 'Visibility Co')

    def test_company_owner_can_view_private_page(self):
        self.company.is_public = False
        self.company.save(update_fields=['is_public'])
        self.client.login(username='vis_employer', password='testpass123')
        response = self.client.get(reverse('companies:detail', kwargs={'slug': self.company.slug}))
        self.assertEqual(response.status_code, 200)

    def test_offline_profiles_excluded_from_carousel_querysets(self):
        self.seeker.is_online = False
        self.seeker.save(update_fields=['is_online'])
        self.company.is_online = False
        self.company.save(update_fields=['is_online'])
        self.assertNotIn(self.seeker, list(carousel_seekers_queryset()))
        self.assertNotIn(self.company, list(carousel_companies_queryset()))
