from django.contrib.auth import get_user_model
from django.test import TestCase
from django.urls import reverse

from jobs.category_data import sync_pezajob_categories
from jobs.models import Job, JobCategory

User = get_user_model()


class PlatformAdminJobManagementTests(TestCase):
    @classmethod
    def setUpTestData(cls):
        sync_pezajob_categories(deactivate_unknown=False)
        cls.job_category = JobCategory.objects.get(slug='information-technology-software')

    def setUp(self):
        self.admin = User.objects.create_superuser(
            username='superadmin',
            email='super@example.com',
            password='pass12345',
        )
        self.employer = User.objects.create_user(
            username='employer1',
            email='employer@example.com',
            password='pass12345',
            role=User.Role.COMPANY,
        )
        self.job = Job.objects.create(
            title='Existing Role',
            slug='existing-role',
            company_name='Acme Ltd',
            company_initials='AL',
            location='Lusaka',
            description='Do the work.',
            responsibilities='Work',
            requirements='Experience',
            posted_by=self.employer,
        )

    def test_admin_can_open_post_job_page(self):
        self.client.force_login(self.admin)
        response = self.client.get(reverse('platform_admin:post_job'))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Post a Job')
        self.assertContains(response, 'id_location_country')
        self.assertContains(response, 'job-location-picker.js')
        self.assertContains(response, 'job-location-section')

    def test_admin_can_edit_any_job(self):
        self.client.force_login(self.admin)
        response = self.client.get(reverse('platform_admin:edit_job', kwargs={'slug': self.job.slug}))
        self.assertEqual(response.status_code, 200)
        self.assertContains(response, 'Existing Role')
        self.assertContains(response, 'Acme Ltd')

    def test_admin_can_update_job_they_do_not_own(self):
        self.client.force_login(self.admin)
        response = self.client.post(reverse('platform_admin:edit_job', kwargs={'slug': self.job.slug}), {
            'company_name': 'Updated Co',
            'title': 'Updated Role',
            'company_industry': 'Information Technology & Software',
            'category': self.job_category.pk,
            'location_scope': 'single',
            'location_country': 'ZM',
            'location_region': 'Copperbelt Province',
            'location_city': 'Ndola',
            'location_regions_multi': [],
            'location_city_text': '',
            'job_type': 'full_time',
            'experience_years_min': 3,
            'experience_years_max': 5,
            'positions_total': 1,
            'application_methods': ['email'],
            'description': 'Updated description.',
            'responsibilities': 'Updated responsibilities',
            'requirements': 'Updated requirements',
            'benefits': '',
            'how_to_apply': 'updated@example.com',
            'ongoing_vacancy': 'on',
        })
        self.assertEqual(response.status_code, 302)
        self.job.refresh_from_db()
        self.assertEqual(self.job.title, 'Updated Role')
        self.assertEqual(self.job.company_name, 'Updated Co')
        self.assertEqual(self.job.location, 'Ndola, Copperbelt Province, Zambia')
        self.assertEqual(self.job.posted_by_id, self.employer.id)

    def test_admin_can_publish_job_for_any_company(self):
        self.client.force_login(self.admin)
        response = self.client.post(reverse('platform_admin:post_job'), {
            'company_name': 'VIZTRANIX',
            'title': 'IT Support Engineer',
            'company_industry': 'Information Technology & Software',
            'category': self.job_category.pk,
            'location_scope': 'single',
            'location_country': 'ZM',
            'location_region': 'Lusaka Province',
            'location_city': 'Lusaka',
            'location_regions_multi': [],
            'location_city_text': '',
            'job_type': 'full_time',
            'experience_years_min': 3,
            'experience_years_max': 5,
            'positions_total': 1,
            'application_methods': ['email'],
            'how_to_apply': 'careers@viztranix.co.zm',
            'description': 'Support role.',
            'responsibilities': 'Provide IT support',
            'requirements': 'Driving license',
            'benefits': '',
            'how_to_apply': 'careers@viztranix.co.zm',
            'ongoing_vacancy': 'on',
        })
        self.assertEqual(response.status_code, 302)
        job = Job.objects.get(title='IT Support Engineer')
        self.assertEqual(job.company_name, 'VIZTRANIX')
        self.assertEqual(job.location, 'Lusaka, Lusaka Province, Zambia')
        self.assertEqual(job.posted_by, self.admin)

    def test_admin_can_publish_remote_job_with_location(self):
        self.client.force_login(self.admin)
        response = self.client.post(reverse('platform_admin:post_job'), {
            'company_name': 'Remote Co',
            'title': 'Remote Developer',
            'company_industry': 'Information Technology & Software',
            'category': self.job_category.pk,
            'location_scope': 'single',
            'location_country': 'ZM',
            'location_region': 'Lusaka Province',
            'location_city': 'Lusaka',
            'location_regions_multi': [],
            'location_city_text': '',
            'job_type': 'remote',
            'experience_years_min': 3,
            'experience_years_max': 5,
            'positions_total': 1,
            'application_methods': ['email'],
            'how_to_apply': 'Apply via email',
            'description': 'Remote role.',
            'responsibilities': 'Build software',
            'requirements': 'Python',
            'benefits': '',
            'ongoing_vacancy': 'on',
        })
        self.assertEqual(response.status_code, 302)
        job = Job.objects.get(title='Remote Developer')
        self.assertEqual(job.job_type, Job.JobType.REMOTE)
        self.assertEqual(job.location, 'Lusaka, Lusaka Province, Zambia')

    def test_employer_cannot_edit_other_companies_job(self):
        other = User.objects.create_user(
            username='otherco',
            email='other@example.com',
            password='pass12345',
            role=User.Role.COMPANY,
        )
        self.client.force_login(other)
        response = self.client.get(reverse('employers:edit_job', kwargs={'slug': self.job.slug}))
        self.assertEqual(response.status_code, 404)
