import pytest
from django.contrib.auth import get_user_model
from django.core.files.uploadedfile import SimpleUploadedFile
from django.db import IntegrityError

from apps.core.authentication.models import UserProfile

User = get_user_model()


@pytest.mark.django_db
def test_create_user_email_unique():
    User.objects.create_user(email="a@example.com", password="x")
    with pytest.raises(IntegrityError):
        User.objects.create_user(email="a@example.com", password="y")


@pytest.mark.django_db
def test_superuser_flags():
    u = User.objects.create_superuser(email="admin@example.com", password="secret")
    assert u.is_staff and u.is_superuser and u.is_active


@pytest.mark.django_db
def test_avatar_url_empty_without_profile():
    u = User.objects.create_user(email="noprofile@example.com", password="x")
    UserProfile.objects.filter(user=u).delete()
    assert u.avatar_url == ""


@pytest.mark.django_db
def test_avatar_url_empty_when_profile_has_no_avatar():
    u = User.objects.create_user(email="noavatar@example.com", password="x")
    assert u.avatar_url == ""


@pytest.mark.django_db
def test_avatar_url_non_empty_when_avatar_set():
    u = User.objects.create_user(email="hasavatar@example.com", password="x")
    profile = u.profile
    profile.avatar.save(
        "face.png",
        SimpleUploadedFile("face.png", b"\x89PNG\r\n\x1a\n", content_type="image/png"),
        save=True,
    )
    u.refresh_from_db()
    assert u.avatar_url
    assert u.avatar_url == profile.avatar.url


# WS1.5 — gender / date_of_birth fields for AR010 women & youth participation indicator


@pytest.mark.django_db
def test_userprofile_age_years_returns_none_when_dob_missing():
    u = User.objects.create_user(email="dob-missing@example.com", password="x")
    assert u.profile.age_years is None
    assert u.profile.is_youth is None


@pytest.mark.django_db
def test_userprofile_is_youth_true_under_threshold():
    from datetime import date

    u = User.objects.create_user(email="youth@example.com", password="x")
    today = date.today()
    u.profile.date_of_birth = date(today.year - 25, today.month, max(today.day - 1, 1))
    u.profile.save()
    assert u.profile.age_years == 25
    assert u.profile.is_youth is True


@pytest.mark.django_db
def test_userprofile_is_youth_false_over_threshold():
    from datetime import date

    u = User.objects.create_user(email="not-youth@example.com", password="x")
    today = date.today()
    u.profile.date_of_birth = date(today.year - 50, today.month, max(today.day - 1, 1))
    u.profile.save()
    assert u.profile.age_years == 50
    assert u.profile.is_youth is False


@pytest.mark.django_db
def test_userprofile_gender_choice_round_trip():
    u = User.objects.create_user(email="gender@example.com", password="x")
    u.profile.gender = UserProfile.Gender.FEMALE
    u.profile.save()
    u.refresh_from_db()
    assert u.profile.gender == "female"
