import json

from django.contrib.auth import get_user_model
from django.test import Client, TestCase
from django.urls import reverse

from employers.forms import JobPostForm
from jobs.application_requirements import extract_apply_email
from jobs.models import Job, JobCategory

User = get_user_model()


class ApplicationRequirementsTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        cls.category = JobCategory.objects.create(name='Technology', slug='technology')
        cls.employer = User.objects.create_superuser(
            username='req_employer',
            email='req_employer@example.com',
            password='TestPass123!',
        )

    def test_extract_apply_email(self):
        self.assertEqual(
            extract_apply_email('Send CV to careers@company.co.zm before Friday'),
            'careers@company.co.zm',
        )

    def test_job_defaults_candidate_fields_and_documents(self):
        job = Job.objects.create(
            title='Requirements Role',
            slug='requirements-role',
            company_name='Co',
            company_slug='co',
            company_initials='CO',
            location='Lusaka',
            category=self.category,
            description='Desc',
            requirements='Req',
            posted_by=self.employer,
            is_active=True,
            application_methods=['ats'],
        )
        self.assertEqual(
            job.application_candidate_fields_list(),
            ['full_name', 'phone', 'email', 'profile'],
        )
        self.assertEqual(job.application_documents_list(), ['cv'])

    def test_dual_method_job_detail_shows_both_sections(self):
        job = Job.objects.create(
            title='Dual Apply Role',
            slug='dual-apply-role',
            company_name='Co',
            company_slug='co',
            company_initials='CO',
            location='Lusaka',
            category=self.category,
            description='Desc',
            requirements='Req',
            posted_by=self.employer,
            is_active=True,
            application_methods=['ats', 'email'],
            how_to_apply='Email hr@company.com with your CV',
        )
        response = Client().get(reverse('jobs:detail', kwargs={'slug': job.slug}))
        self.assertContains(response, 'Apply through PezaJob')
        self.assertContains(response, 'Apply by email')
        self.assertContains(response, 'hr@company.com')

    def test_form_persists_custom_documents_on_job_model(self):
        job = Job.objects.create(
            title='Custom Docs Role',
            slug='custom-docs-role',
            company_name='Co',
            company_slug='co',
            company_initials='CO',
            location='Lusaka',
            category=self.category,
            description='Desc',
            requirements='Req',
            posted_by=self.employer,
            is_active=True,
            application_methods=['ats'],
            application_documents=['cv', 'cover_letter', 'portfolio'],
            screening_questions_enabled=True,
            screening_questions=[
                {'id': 'q1', 'text': 'Are you in Lusaka?', 'required': True},
            ],
        )
        self.assertIn('cover_letter', job.application_documents_list())
        self.assertEqual(len(job.screening_questions_list()), 1)
