from __future__ import annotations

from datetime import date

import pytest

from apps.alumni.profiles.models import AlumniProfile, AlumniSource
from apps.alumni.profiles.services import (
    create_from_graduation,
    create_from_rep_completion,
    toggle_visibility,
)


@pytest.mark.django_db
def test_create_from_graduation_is_idempotent(institution, scholar_user, scholarship):
    from apps.rims.scholarships.models import GraduationRecord, Scholar

    scholar = Scholar.objects.get(user=scholar_user)
    gr = GraduationRecord.objects.create(scholar=scholar, graduated_on=date(2024, 6, 1))

    # Signal already fired in GraduationRecord.save; explicit call should remain idempotent.
    profile = create_from_graduation(gr)
    profile2 = create_from_graduation(gr)
    assert profile.pk == profile2.pk
    assert AlumniProfile.objects.filter(user=scholar_user).count() == 1
    assert profile.degrees.count() == 1
    assert gr.pk in profile.source_refs["graduation_ids"]


@pytest.mark.django_db
def test_create_from_rep_completion_merges_with_scholarship(
    institution, scholar_user, scholarship
):
    from apps.rims.scholarships.models import GraduationRecord, Scholar

    scholar = Scholar.objects.get(user=scholar_user)
    gr = GraduationRecord.objects.create(scholar=scholar, graduated_on=date(2024, 6, 1))
    create_from_graduation(gr)

    payload = {
        "learner_id": scholar_user.pk,
        "enrolment_id": 9001,
        "course_title": "Agricultural Statistics 101",
        "certificate_number": "CERT-9001",
    }
    profile = create_from_rep_completion(payload)
    assert profile is not None
    assert profile.source == AlumniSource.MIXED
    assert 9001 in profile.source_refs["rep_enrolment_ids"]
    assert profile.certificates.filter(rep_certificate_number="CERT-9001").exists()


@pytest.mark.django_db
def test_toggle_visibility_sets_published_at(alumni_user):
    profile = AlumniProfile.objects.create(user=alumni_user)
    assert profile.visibility_consent is False
    assert profile.published_at is None
    toggle_visibility(profile, True)
    profile.refresh_from_db()
    assert profile.visibility_consent is True
    assert profile.published_at is not None


@pytest.mark.django_db
def test_create_from_rep_completion_unknown_learner_returns_none():
    assert create_from_rep_completion({"learner_id": 999_999}) is None
