"""Teste US-004 (PRD 5.20): rezolvare mediu tinta la ingestie + respingere tinte indisponibile.

Fixtura `conn` urmareste acelasi pattern ca tests/test_accounts.py:
monkeypatch AUTOPASS_DB_PATH pe tempdir, cache_clear, init_db, get_connection.
"""

from __future__ import annotations

import os
import tempfile

import pytest


@pytest.fixture()
def conn(monkeypatch):
    tmp = tempfile.mkdtemp()
    monkeypatch.setenv("AUTOPASS_DB_PATH", os.path.join(tmp, "test_rar_env_resolve.db"))
    from app.config import get_settings
    get_settings.cache_clear()
    from app.db import get_connection, init_db
    init_db()
    c = get_connection()
    yield c
    c.close()
    get_settings.cache_clear()


def _seteaza_cont_ambele(conn) -> None:
    """Configureaza contul id=1 cu ambele medii disponibile, default = prod."""
    conn.execute(
        """UPDATE accounts
           SET rar_test_enabled=1, rar_creds_test_enc='T',
               rar_prod_enabled=1, rar_creds_prod_enc='P',
               rar_env_default='prod'
           WHERE id=1"""
    )
    conn.commit()


def _seteaza_cont_doar_prod(conn) -> None:
    """Configureaza contul id=1 cu doar prod disponibil, test off."""
    conn.execute(
        """UPDATE accounts
           SET rar_test_enabled=0, rar_creds_test_enc=NULL,
               rar_prod_enabled=1, rar_creds_prod_enc='P',
               rar_env_default='prod'
           WHERE id=1"""
    )
    conn.commit()


def test_cerere_castiga(conn):
    """Cererea explicita bate default-ul contului (prod)."""
    _seteaza_cont_ambele(conn)
    from app.rar_env import rezolva_rar_env
    rezultat = rezolva_rar_env(conn, 1, "test")
    assert rezultat == "test"


def test_fallback_default_cont(conn):
    """Fara cerere explicita -> default-ul contului (prod)."""
    _seteaza_cont_ambele(conn)
    from app.rar_env import rezolva_rar_env
    rezultat = rezolva_rar_env(conn, 1, None)
    assert rezultat == "prod"


def test_tinta_indisponibila_respinsa(conn):
    """Cerere pentru 'test' pe un cont doar-prod -> MediuIndisponibil cu .disponibile=['prod']."""
    _seteaza_cont_doar_prod(conn)
    from app.rar_env import MediuIndisponibil, rezolva_rar_env
    with pytest.raises(MediuIndisponibil) as exc_info:
        rezolva_rar_env(conn, 1, "test")
    err = exc_info.value
    assert err.env == "test"
    assert err.disponibile == ["prod"]


def test_valoare_invalida(conn):
    """Cerere cu valoare in afara VALID_ENVS -> ValueError, fara fallback silentios."""
    from app.rar_env import rezolva_rar_env
    with pytest.raises(ValueError, match="mediu invalid"):
        rezolva_rar_env(conn, 1, "staging")


def test_zero_medii_cade_pe_ancora(conn, monkeypatch):
    """Cont fara niciun mediu disponibil -> ancora globala AUTOPASS_RAR_ENV."""
    # id=1 din fresh DB: rar_prod_enabled=1 dar rar_creds_prod_enc=NULL -> 0 disponibile
    # (valoarea implicita a schemei: prod enabled fara creds -> nedisponibil)
    monkeypatch.setenv("AUTOPASS_RAR_ENV", "test")
    from app.config import get_settings
    get_settings.cache_clear()
    from app.rar_env import rezolva_rar_env
    rezultat = rezolva_rar_env(conn, 1, None)
    assert rezultat == "test"
