"""Shared fixtures for the 5to sueño backend tests."""
import os
import pytest
import requests

BASE_URL = os.environ.get(
    "REACT_APP_BACKEND_URL", "https://quinto-sueno.preview.emergentagent.com"
).rstrip("/")

CREDS = {
    "ceo": ("ceo@5tosueno.com", "Ceo5to2026!"),
    "admin": ("admin@5tosueno.com", "Admin5to2026!"),
    "rh": ("rh@5tosueno.com", "Rh5to2026!"),
    "pm": ("pm@5tosueno.com", "Pm5to2026!"),
    "pmo": ("pmo@5tosueno.com", "Pmo5to2026!"),
    "sales": ("sales@5tosueno.com", "Sales5to2026!"),
    "marketing": ("marketing@5tosueno.com", "Mkt5to2026!"),
    "account_manager": ("account@5tosueno.com", "Acc5to2026!"),
    "collaborator": ("dev@5tosueno.com", "Dev5to2026!"),
    "client": ("cliente@empresa.com", "Cliente5to2026!"),
}


def _login_session(email: str, password: str) -> requests.Session:
    s = requests.Session()
    s.headers.update({"Content-Type": "application/json"})
    r = s.post(f"{BASE_URL}/api/auth/login", json={"email": email, "password": password}, timeout=20)
    assert r.status_code == 200, f"Login failed for {email}: {r.status_code} {r.text}"
    return s


@pytest.fixture(scope="session")
def base_url():
    return BASE_URL


@pytest.fixture(scope="session")
def anon():
    s = requests.Session()
    s.headers.update({"Content-Type": "application/json"})
    return s


@pytest.fixture(scope="session")
def admin_sess():
    return _login_session(*CREDS["admin"])


@pytest.fixture(scope="session")
def pm_sess():
    return _login_session(*CREDS["pm"])


@pytest.fixture(scope="session")
def collab_sess():
    return _login_session(*CREDS["collaborator"])


@pytest.fixture(scope="session")
def client_sess():
    return _login_session(*CREDS["client"])


@pytest.fixture(scope="session")
def ceo_sess():
    return _login_session(*CREDS["ceo"])


@pytest.fixture(scope="session")
def rh_sess():
    return _login_session(*CREDS["rh"])


@pytest.fixture(scope="session")
def pmo_sess():
    return _login_session(*CREDS["pmo"])


@pytest.fixture(scope="session")
def sales_sess():
    return _login_session(*CREDS["sales"])


@pytest.fixture(scope="session")
def marketing_sess():
    return _login_session(*CREDS["marketing"])


@pytest.fixture(scope="session")
def account_sess():
    return _login_session(*CREDS["account_manager"])


@pytest.fixture(scope="session")
def user_ids(admin_sess):
    r = admin_sess.get(f"{BASE_URL}/api/users")
    assert r.status_code == 200
    ids = {}
    for u in r.json():
        ids[u["role"]] = ids.get(u["role"]) or u["id"]
        ids[u["email"]] = u["id"]
    return ids
