import pytest
from django.contrib.auth.models import Permission
from django.contrib.contenttypes.models import ContentType
from django.urls import reverse

from apps.alumni.careers.models import CareerResource, CareerResourceAccessLog, CVProfile, CVSection, JobListing
from apps.alumni.careers.services import normalize_section_data


def _grant_manage_courses(user):
    """Grant the careers job-posting permission (formerly this leaned on the
    REP ``manage_courses`` capability; the job board now has its own gate)."""
    perm = Permission.objects.get(
        content_type=ContentType.objects.get_for_model(JobListing),
        codename="post_job_listing",
    )
    user.user_permissions.add(perm)


@pytest.mark.django_db
def test_job_listing_pending_and_admin_review_publish(client, django_user_model):
    manager = django_user_model.objects.create_superuser(email="career-admin@example.com", password="pw")
    employer = django_user_model.objects.create_user(email="career-employer@example.com", password="pw")
    _grant_manage_courses(employer)
    client.force_login(employer)
    create_url = reverse("rep_career:job_create")
    resp = client.post(
        create_url,
        {
            "title": "Research Assistant",
            "company": "RUFORUM",
            "location": "Kampala",
            "job_type": JobListing.JobType.FULL_TIME,
            "sector": "",
            "audience": JobListing.Audience.ALL,
            "description": "desc",
            "requirements": "",
            "salary_range": "",
            "closes_at": "",
        },
    )
    assert resp.status_code == 302
    listing = JobListing.objects.latest("pk")
    assert listing.listing_status == JobListing.ListingStatus.PENDING
    assert listing.is_active is False

    client.force_login(manager)
    review_url = reverse("rep_career:listing_review_detail", kwargs={"pk": listing.pk})
    resp2 = client.post(
        review_url,
        {"listing_status": JobListing.ListingStatus.PUBLISHED, "employer_notes": "Approved", "is_active": "on"},
    )
    assert resp2.status_code == 302
    listing.refresh_from_db()
    assert listing.listing_status == JobListing.ListingStatus.PUBLISHED
    assert listing.is_active is True


@pytest.mark.django_db
def test_resource_detail_logs_access(client, django_user_model):
    user = django_user_model.objects.create_user(email="career-learner@example.com", password="pw")
    resource = CareerResource.objects.create(
        title="Interview tips",
        slug="interview-tips",
        resource_type=CareerResource.ResourceType.ARTICLE,
        body="hello",
        is_published=True,
    )
    client.force_login(user)
    url = reverse("rep_career:resource_detail", kwargs={"slug": resource.slug})
    resp = client.get(url)
    assert resp.status_code == 200
    assert CareerResourceAccessLog.objects.filter(resource=resource, user=user).count() == 1


@pytest.mark.django_db
def test_cv_references_section_roundtrip(django_user_model):
    user = django_user_model.objects.create_user(email="career-cv@example.com", password="pw")
    cv = CVProfile.objects.create(user=user)
    refs = normalize_section_data("references", ["Dr. A - +256...", {"text": "Ms. B - b@example.com"}])
    CVSection.objects.create(cv=cv, section_type=CVSection.SectionType.REFERENCES, data=refs, sort_order=6)
    sec = CVSection.objects.get(cv=cv, section_type=CVSection.SectionType.REFERENCES)
    assert isinstance(sec.data, list)
    assert len(sec.data) == 2
