"""Teste US-007 (PRD 5.20): validare credentiale RAR pe env-ul setului de creds.

Premisa confirmata live (2026-06-29): creds prod NU se valideaza pe RAR test si
invers (401 incrucisat). Deci login-ul de proba TREBUIE sa loveasca endpoint-ul
mediului caruia ii apartin credentialele, nu URL-ul global AUTOPASS_RAR_ENV.

Functie testata:
  routes._valideaza_login_rar(settings, email, password, env)

Teste:
  test_valideaza_pe_env_creds  -- login pe env='prod' foloseste base_url prod (nu test)
  test_mesaj_distinge_env      -- esec pe test vs prod produce mesaje diferite
"""

from __future__ import annotations

import os
import tempfile

import pytest

from app.rar_client import RarAuthError


# ---------------------------------------------------------------------------
# Fixture izolat
# ---------------------------------------------------------------------------


@pytest.fixture()
def env_db(monkeypatch):
    """DB temporara + settings curate. Numele 'env_db' evita coliziunea cu parametrul
    'env' folosit in testele de mai jos ca string ('test'/'prod')."""
    tmp = tempfile.mkdtemp()
    monkeypatch.setenv("AUTOPASS_DB_PATH", os.path.join(tmp, "t.db"))
    monkeypatch.setenv("AUTOPASS_SEED_OPERATII_ENABLED", "false")
    from app.config import get_settings

    get_settings.cache_clear()
    from app.db import init_db

    init_db()
    yield
    get_settings.cache_clear()


# ---------------------------------------------------------------------------
# Stub-uri RarClient
# ---------------------------------------------------------------------------


class _RarClientSpy:
    """Inregistreaza base_url-ul cu care a fost construit si simuleaza login reusit."""

    captured: dict = {}

    def __init__(self, settings=None, *, base_url=None):
        _RarClientSpy.captured["base_url"] = base_url

    def login(self, email, password):
        return "TOKEN-SPY"

    def __enter__(self):
        return self

    def __exit__(self, *args):
        pass

    def close(self):
        pass


class _RarClientFail:
    """Simuleaza login esuat (RarAuthError 401) indiferent de env."""

    def __init__(self, settings=None, *, base_url=None):
        pass

    def login(self, email, password):
        raise RarAuthError("Credentiale RAR invalide", status_code=401)

    def __enter__(self):
        return self

    def __exit__(self, *args):
        pass

    def close(self):
        pass


# ---------------------------------------------------------------------------
# Teste
# ---------------------------------------------------------------------------


def test_valideaza_pe_env_creds(env_db, monkeypatch):
    """Cand validezi creds pentru env='prod', clientul de login e creat cu base_url-ul prod.

    US-007 AC: 'validarea foloseste env-ul setului de creds verificat'.
    Premisa: creds prod nu se valideaza pe RAR test (401 incrucisat), deci
    clientul TREBUIE sa foloseasca base_url-ul prod, nu cel de test.
    """
    import app.web.routes as routes_mod
    from app.config import get_settings

    _RarClientSpy.captured = {}
    monkeypatch.setattr(routes_mod, "RarClient", _RarClientSpy)

    settings = get_settings()
    ok, mesaj = routes_mod._valideaza_login_rar(settings, "a@b.ro", "parola", "prod")

    assert ok is True, f"Login simulat trebuia sa reuseasca: mesaj={mesaj!r}"
    assert mesaj is None

    base_url_folosit = _RarClientSpy.captured.get("base_url")
    assert base_url_folosit == settings.rar_base_url_prod, (
        f"Clientul trebuia construit cu rar_base_url_prod={settings.rar_base_url_prod!r},"
        f" dar a primit base_url={base_url_folosit!r}"
    )
    assert base_url_folosit != settings.rar_base_url_test, (
        "Clientul nu trebuia sa foloseasca base_url-ul de TEST la validarea creds PROD"
    )


def test_valideaza_pe_env_creds_test(env_db, monkeypatch):
    """Cand validezi creds pentru env='test', clientul de login e creat cu base_url-ul test."""
    import app.web.routes as routes_mod
    from app.config import get_settings

    _RarClientSpy.captured = {}
    monkeypatch.setattr(routes_mod, "RarClient", _RarClientSpy)

    settings = get_settings()
    ok, mesaj = routes_mod._valideaza_login_rar(settings, "a@b.ro", "parola", "test")

    assert ok is True
    base_url_folosit = _RarClientSpy.captured.get("base_url")
    assert base_url_folosit == settings.rar_base_url_test, (
        f"Clientul trebuia construit cu rar_base_url_test={settings.rar_base_url_test!r},"
        f" dar a primit base_url={base_url_folosit!r}"
    )
    assert base_url_folosit != settings.rar_base_url_prod


def test_mesaj_distinge_env(env_db, monkeypatch):
    """La esec de login pe test vs prod, mesajul difera ('TESTARE' vs 'PRODUCTIE').

    US-007 AC: 'mesaj distinct creds invalide pe TESTARE vs pe PRODUCTIE'.
    Design F6/F7: banner-ul de eroare indica pe ce mediu a esuat login-ul.
    """
    import app.web.routes as routes_mod
    from app.config import get_settings

    monkeypatch.setattr(routes_mod, "RarClient", _RarClientFail)

    settings = get_settings()

    ok_test, msg_test = routes_mod._valideaza_login_rar(settings, "a@b.ro", "parola", "test")
    ok_prod, msg_prod = routes_mod._valideaza_login_rar(settings, "a@b.ro", "parola", "prod")

    assert ok_test is False, "Esecul la test trebuia sa returneze ok=False"
    assert ok_prod is False, "Esecul la prod trebuia sa returneze ok=False"

    assert msg_test is not None and "TESTARE" in msg_test, (
        f"Mesajul la esec pe test trebuia sa contina 'TESTARE': {msg_test!r}"
    )
    assert msg_prod is not None and "PRODUCTIE" in msg_prod, (
        f"Mesajul la esec pe prod trebuia sa contina 'PRODUCTIE': {msg_prod!r}"
    )
    # Cross-check: etichetele nu se amesteca
    assert "PRODUCTIE" not in (msg_test or ""), (
        f"Mesajul esec test nu trebuia sa mentioneze PRODUCTIE: {msg_test!r}"
    )
    assert "TESTARE" not in (msg_prod or ""), (
        f"Mesajul esec prod nu trebuia sa mentioneze TESTARE: {msg_prod!r}"
    )
