from django.test import TestCase

from accounts.models import User
from companies.models import Company
from jobs.models import Job, SavedJob
from seekers.models import SeekerProfile
from subscriptions.benefits import sync_seeker_subscription_benefits
from subscriptions.management.commands.seed_plans import PLANS
from subscriptions.models import SeekerSubscription, SubscriptionPlan
from subscriptions.usage import can_company_post_job, can_seeker_save_job, get_seeker_benefits


class SubscriptionBenefitsTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        for plan_data in PLANS:
            SubscriptionPlan.objects.update_or_create(
                slug=plan_data['slug'],
                defaults={**plan_data, 'is_active': True},
            )

        cls.seeker = User.objects.create_user(
            username='benefits_seeker',
            email='benefits-seeker@test.com',
            password='testpass123',
            role=User.Role.SEEKER,
        )
        cls.profile = SeekerProfile.objects.create(
            user=cls.seeker,
            slug='benefits-seeker',
            full_name='Benefits Seeker',
            headline='Developer',
            category='IT',
            location='Lusaka',
        )
        cls.plus_plan = SubscriptionPlan.objects.get(slug='seeker-professional-plus')

        cls.employer = User.objects.create_user(
            username='benefits_employer',
            email='benefits-employer@test.com',
            password='testpass123',
            role=User.Role.COMPANY,
        )
        cls.company = Company.objects.create(
            name='Benefits Co',
            slug='benefits-co',
            initials='BC',
            industry='Tech',
            location='Lusaka',
            description='Test company',
            owner=cls.employer,
        )

    def test_plus_subscription_applies_gold_tier(self):
        subscription = SeekerSubscription.objects.create(
            user=self.seeker,
            plan=self.plus_plan,
            is_active=True,
        )
        sync_seeker_subscription_benefits(subscription)
        self.profile.refresh_from_db()
        self.assertEqual(self.profile.tier, 'gold')
        self.assertTrue(self.profile.is_featured)

    def test_free_seeker_saved_job_limit(self):
        for index in range(10):
            job = Job.objects.create(
                title=f'Limit Test Job {index}',
                slug=f'limit-test-job-{index}',
                company_name='Benefits Co',
                company_initials='BC',
                location='Lusaka',
                description='Test',
                posted_by=self.employer,
                is_active=True,
            )
            SavedJob.objects.create(user=self.seeker, job=job)

        allowed, message = can_seeker_save_job(self.seeker)
        self.assertFalse(allowed)
        self.assertIn('limit', message.lower())

    def test_company_without_subscription_cannot_post_jobs(self):
        allowed, message = can_company_post_job(self.company, self.employer)
        self.assertFalse(allowed)
        self.assertIn('subscription', message.lower())

    def test_plus_seeker_benefits_include_alerts(self):
        SeekerSubscription.objects.create(
            user=self.seeker,
            plan=self.plus_plan,
            is_active=True,
        )
        benefits = get_seeker_benefits(self.seeker)
        self.assertTrue(benefits.priority_job_alerts)
        self.assertIsNone(benefits.saved_jobs_limit)
