from django.test import TestCase

from jobs.category_data import PEZAJOB_JOB_CATEGORIES, sync_pezajob_categories
from jobs.matching import compute_seeker_job_match
from jobs.models import Job, JobCategory
from seekers.models import SeekerProfile


class JobCategorySystemTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        sync_pezajob_categories(deactivate_unknown=False)
        cls.it_category = JobCategory.objects.get(slug='information-technology-software')
        cls.finance_category = JobCategory.objects.get(slug='accounting-finance')

    def test_sync_creates_all_canonical_categories(self):
        self.assertEqual(JobCategory.objects.filter(is_active=True).count(), len(PEZAJOB_JOB_CATEGORIES))

    def test_categories_have_official_numbers(self):
        hr = JobCategory.objects.get(slug='human-resources-people')
        self.assertEqual(hr.number, 15)
        self.assertEqual(hr.numbered_name, '15. Human Resources & People')
        numbers = list(
            JobCategory.objects.filter(is_active=True).order_by('number').values_list('number', flat=True)
        )
        self.assertEqual(numbers, list(range(1, len(PEZAJOB_JOB_CATEGORIES) + 1)))

    def test_category_match_boosts_alert_score(self):
        profile = SeekerProfile.objects.create(
            slug='it-seeker',
            full_name='IT Seeker',
            headline='Developer',
            job_category=self.it_category,
            category=self.it_category.name,
            category_slug=self.it_category.slug,
            location='Lusaka',
            skills='Python\nDjango',
        )
        matched_job = Job.objects.create(
            title='Python Developer',
            slug='python-dev-cat',
            company_name='Acme',
            company_initials='AC',
            location='Lusaka',
            description='Python Django REST',
            responsibilities='Build APIs',
            requirements='Python\nDjango',
            category=self.it_category,
        )
        other_job = Job.objects.create(
            title='Accountant',
            slug='accountant-cat',
            company_name='Acme',
            company_initials='AC',
            location='Lusaka',
            description='Finance role',
            responsibilities='Reports',
            requirements='Excel',
            category=self.finance_category,
        )
        matched_score = compute_seeker_job_match(profile, matched_job)
        other_score = compute_seeker_job_match(profile, other_job)
        self.assertGreater(matched_score, other_score)
