"""Teste pentru app/errors.py — catalog central de erori (US-001 / PRD 5.4).

Urmeaza TDD: testele sunt scrise INAINTE de implementare.
"""

from __future__ import annotations

import pytest

from app.errors import CATALOG, eroare


# ---------------------------------------------------------------------------
# test_catalog_complet
# ---------------------------------------------------------------------------

def test_catalog_complet():
    """Fiecare intrare din CATALOG are 'problema' si 'fix' ne-goale."""
    assert len(CATALOG) >= 24, "CATALOG trebuie sa contina cel putin 24 de coduri"
    for cod, entry in CATALOG.items():
        assert "problema" in entry, f"Lipseste 'problema' pentru codul {cod!r}"
        assert "fix" in entry, f"Lipseste 'fix' pentru codul {cod!r}"
        assert isinstance(entry["problema"], str) and entry["problema"].strip(), (
            f"'problema' goala pentru codul {cod!r}"
        )
        assert isinstance(entry["fix"], str) and entry["fix"].strip(), (
            f"'fix' gol pentru codul {cod!r}"
        )


# ---------------------------------------------------------------------------
# test_eroare_construieste_3niveluri
# ---------------------------------------------------------------------------

def test_eroare_construieste_3niveluri():
    """eroare() intoarce dict cu exact cheile asteptate si valorile corecte."""
    rezultat = eroare("VIN_FORMAT", field="vin", cauza="VIN-ul are 15 caractere")

    chei_asteptate = {"field", "cod", "problema", "cauza", "fix", "message"}
    assert set(rezultat.keys()) == chei_asteptate, (
        f"Cheile obtinute: {set(rezultat.keys())} — asteptate: {chei_asteptate}"
    )

    assert rezultat["cod"] == "VIN_FORMAT"
    assert rezultat["field"] == "vin"
    assert rezultat["cauza"] == "VIN-ul are 15 caractere"
    assert rezultat["problema"] == CATALOG["VIN_FORMAT"]["problema"]
    assert rezultat["fix"] == CATALOG["VIN_FORMAT"]["fix"]
    # message == cauza cand cauza este dat
    assert rezultat["message"] == "VIN-ul are 15 caractere"


# ---------------------------------------------------------------------------
# test_message_back_compat
# ---------------------------------------------------------------------------

def test_message_back_compat():
    """message == cauza cand cauza e dat; message == problema cand cauza lipseste."""
    # Cu cauza
    cu_cauza = eroare("DATA_FORMAT", cauza="data_primita=31/06/2026")
    assert cu_cauza["message"] == "data_primita=31/06/2026"

    # Fara cauza
    fara_cauza = eroare("DATA_FORMAT")
    assert fara_cauza["message"] == CATALOG["DATA_FORMAT"]["problema"]
    # cauza din dict e None sau egala cu problema
    assert fara_cauza["cauza"] == CATALOG["DATA_FORMAT"]["problema"]


# ---------------------------------------------------------------------------
# test_cod_necunoscut_ridica
# ---------------------------------------------------------------------------

def test_cod_necunoscut_ridica():
    """eroare() pe cod absent din CATALOG ridica KeyError."""
    with pytest.raises(KeyError):
        eroare("INEXISTENT")
