"""FRREP-UR004 — duplicate-email registration must block with an inline
error that includes a 'Forgot Password' link, not just Django's generic
unique-constraint message."""
from __future__ import annotations

import pytest
from django.contrib.auth import get_user_model
from django.urls import reverse

from apps.core.authentication.forms import RegisterForm
from apps.core.authentication.models import Institution

User = get_user_model()


def _form_data(**overrides):
    data = {
        "first_name": "Ada",
        "last_name": "Eze",
        "email": "existing@example.com",
        "phone": "",
        "password1": "S0meStrongPass!",
        "password2": "S0meStrongPass!",
        "institution": "",
        "non_partner_institution": "Some University",
        "role": "learner",
    }
    data.update(overrides)
    return data


@pytest.mark.django_db
def test_clean_email_blocks_duplicate():
    User.objects.create_user(email="existing@example.com", password="x")
    form = RegisterForm(data=_form_data())
    assert not form.is_valid()
    assert "email" in form.errors


@pytest.mark.django_db
def test_duplicate_email_error_contains_reset_link():
    User.objects.create_user(email="existing@example.com", password="x")
    form = RegisterForm(data=_form_data())
    form.is_valid()
    reset_url = reverse("accounts:password_reset")
    rendered_errors = "".join(str(e) for e in form.errors["email"])
    assert reset_url in rendered_errors
    assert "Forgot your password" in rendered_errors
    assert "already exists" in rendered_errors


@pytest.mark.django_db
def test_duplicate_email_check_is_case_insensitive():
    User.objects.create_user(email="Existing@Example.com", password="x")
    form = RegisterForm(data=_form_data(email="existing@example.com"))
    assert not form.is_valid()
    assert "email" in form.errors


@pytest.mark.django_db
def test_new_email_passes_clean_email():
    form = RegisterForm(data=_form_data(email="brand-new@example.com"))
    assert form.is_valid(), form.errors
    assert form.cleaned_data["email"] == "brand-new@example.com"


@pytest.mark.django_db
def test_register_view_shows_reset_link_on_duplicate(client):
    User.objects.create_user(email="dup-view@example.com", password="x")
    inst = Institution.objects.create(name="Test U", is_active=True)
    resp = client.post(
        reverse("accounts:register"),
        _form_data(email="dup-view@example.com", institution=inst.pk, non_partner_institution=""),
    )
    assert resp.status_code == 200
    # Registration was blocked — still exactly the one pre-existing account.
    assert User.objects.filter(email="dup-view@example.com").count() == 1
    reset_url = reverse("accounts:password_reset")
    assert reset_url.encode() in resp.content
