"""
13-årsgrensen (2026-08-10, ADR) håndheves server-side i update_profile --
eneste vei inn i appen. Kaller den faktiske funksjonen direkte, ikke en
gjenimplementering av alderslogikken."""

from datetime import date, timedelta

import pytest
from fastapi import HTTPException

from app import db as app_db
from app.auth import CurrentUser
from app.routers.auth import ProfileUpdate, update_profile

from tests.conftest import create_user


def _birth_date_for_age(years: int, extra_days: int = 0) -> date:
    """extra_days=0 gir eksakt `years` år gammel i dag; extra_days=+1 gir
    én dag YNGRE enn `years` (dvs. fyller `years` år i MORGEN, ikke i dag --
    fødselsdatoen flyttes én dag SENERE enn "eksakt `years` i dag")."""
    today = date.today()
    try:
        return today.replace(year=today.year - years) + timedelta(days=extra_days)
    except ValueError:
        # 29. februar-kant -- ikke relevant for testens formål, men trygt.
        return today.replace(year=today.year - years, day=28) + timedelta(days=extra_days)


async def test_exactly_13_today_is_allowed(pool):
    user_id = await create_user()
    out = await update_profile(
        ProfileUpdate(birth_date=_birth_date_for_age(13)),
        user=CurrentUser(user_id=user_id),
    )
    assert out.birth_date == _birth_date_for_age(13)


async def test_one_day_short_of_13_is_rejected(pool):
    user_id = await create_user()
    with pytest.raises(HTTPException) as exc_info:
        await update_profile(
            ProfileUpdate(birth_date=_birth_date_for_age(13, extra_days=1)),
            user=CurrentUser(user_id=user_id),
        )
    assert exc_info.value.status_code == 400
    assert exc_info.value.detail["code"] == "UNDER_MINIMUM_AGE"

    # Og bekreft at feilen faktisk stoppet skrivingen -- ingen delvis
    # oppdatering av fødselsdato ble liggende igjen.
    async with app_db.plain_connection() as conn:
        row = await conn.fetchrow("SELECT birth_date FROM app_user WHERE id = $1", user_id)
    assert row["birth_date"] is None


async def test_well_under_13_is_rejected(pool):
    user_id = await create_user()
    with pytest.raises(HTTPException) as exc_info:
        await update_profile(
            ProfileUpdate(birth_date=_birth_date_for_age(8)),
            user=CurrentUser(user_id=user_id),
        )
    assert exc_info.value.status_code == 400
    assert exc_info.value.detail["code"] == "UNDER_MINIMUM_AGE"


async def test_updating_other_fields_without_birth_date_skips_age_check(pool):
    user_id = await create_user()
    out = await update_profile(
        ProfileUpdate(bio="Elsker links-golf"),
        user=CurrentUser(user_id=user_id),
    )
    assert out.bio == "Elsker links-golf"


async def test_adult_birth_date_is_allowed(pool):
    user_id = await create_user()
    out = await update_profile(
        ProfileUpdate(birth_date=_birth_date_for_age(35)),
        user=CurrentUser(user_id=user_id),
    )
    assert out.birth_date == _birth_date_for_age(35)
