import pytest
from django.core import mail
from django.test import override_settings
from django.urls import reverse

from apps.core.permissions.roles import UserRole


@pytest.mark.django_db
@override_settings(EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend")
def test_user_create_sends_invitation_with_reset_link_not_password(client, django_user_model):
    admin = django_user_model.objects.create_user(
        email="admin-invite@x.com",
        password="adminpass123",
        is_superuser=True,
        is_staff=True,
    )
    client.force_login(admin)
    secret = "UniqueInviteTestPwd!9xZq"
    r = client.post(
        reverse("core:user_manage_create"),
        data={
            "email": "invitee-invite@x.com",
            "first_name": "New",
            "last_name": "User",
            "phone": "",
            "institution": "",
            "role": UserRole.REVIEWER,
            "is_active": "on",
            "password1": secret,
            "password2": secret,
            "send_invitation_email": "on",
        },
    )
    assert r.status_code == 302
    assert r.url == reverse("core:user_manage_edit", kwargs={"pk": django_user_model.objects.get(email="invitee-invite@x.com").pk})
    assert len(mail.outbox) == 1
    msg = mail.outbox[0]
    assert msg.to == ["invitee-invite@x.com"]
    combined = msg.body
    if msg.alternatives:
        combined += msg.alternatives[0][0]
    assert "/accounts/password-reset/" in combined
    assert secret not in msg.body
    assert secret not in (msg.alternatives[0][0] if msg.alternatives else "")


@pytest.mark.django_db
@override_settings(EMAIL_BACKEND="django.core.mail.backends.locmem.EmailBackend")
def test_user_create_skips_email_when_invitation_unchecked(client, django_user_model):
    admin = django_user_model.objects.create_user(
        email="admin2-invite@x.com",
        password="adminpass123",
        is_superuser=True,
        is_staff=True,
    )
    client.force_login(admin)
    r = client.post(
        reverse("core:user_manage_create"),
        data={
            "email": "noemail-invite@x.com",
            "first_name": "No",
            "last_name": "Mail",
            "phone": "",
            "institution": "",
            "role": UserRole.SCHOLAR,
            "is_active": "on",
            "password1": "some-pass-word-123",
            "password2": "some-pass-word-123",
        },
    )
    assert r.status_code == 302
    assert len(mail.outbox) == 0
