from django.contrib.auth import get_user_model
from django.test import TestCase

from ats.services import change_application_status
from jobs.models import Job, JobApplication

User = get_user_model()


class JobPositionsTests(TestCase):
    def setUp(self):
        self.employer = User.objects.create_user(
            username='employer_pos',
            email='employer_pos@test.com',
            password='testpass123',
            role=User.Role.COMPANY,
        )
        self.seeker = User.objects.create_user(
            username='seeker_pos',
            email='seeker_pos@test.com',
            password='testpass123',
            role=User.Role.SEEKER,
        )
        self.job = Job.objects.create(
            title='Multi Hire Role',
            company_name='Acme',
            company_initials='AC',
            location='Lusaka',
            job_type=Job.JobType.FULL_TIME,
            experience_level=Job.ExperienceLevel.MID,
            description='Desc',
            responsibilities='Work',
            requirements='Skills',
            positions_total=3,
            posted_by=self.employer,
            is_active=True,
        )
        self.application = JobApplication.objects.create(
            job=self.job,
            applicant=self.seeker,
        )

    def test_hire_increments_positions_filled(self):
        change_application_status(
            self.application,
            JobApplication.Status.HIRED,
            self.employer,
        )
        self.job.refresh_from_db()
        self.assertEqual(self.job.positions_filled, 1)
        self.assertEqual(self.job.positions_remaining, 2)
        self.assertTrue(self.job.accepts_applications)

    def test_all_positions_filled_stops_applications(self):
        self.job.positions_filled = 3
        self.job.save(update_fields=['positions_filled'])
        self.assertFalse(self.job.accepts_applications)
        self.assertEqual(self.job.positions_display, 'All 3 positions filled')

    def test_unhire_decrements_positions_filled(self):
        change_application_status(
            self.application,
            JobApplication.Status.HIRED,
            self.employer,
        )
        change_application_status(
            self.application,
            JobApplication.Status.SHORTLISTED,
            self.employer,
        )
        self.job.refresh_from_db()
        self.assertEqual(self.job.positions_filled, 0)
        self.assertEqual(self.job.positions_remaining, 3)
