"""Agrégations du tableau de bord : semaines, mois (règle du jeudi / prorata), brouillons, vide ≠ zéro."""
from tests.conftest import Api


def put_validated(api: Api, y: int, w: int, values: dict[int, object]):
    rows = [{"indicator_id": i, "value": v, "observation": ""} for i, v in values.items()]
    b = api.put(f"/api/bilans/{y}/{w}/draft", {"revision": 0, "rows": rows}).json()
    r = api.post(f"/api/bilans/{y}/{w}/validate", {"revision": b["revision"], "confirm": True})
    assert r.status_code == 200, r.text


def row(stats, ind_id):
    return next(r for r in stats["rows"] if r["indicator_id"] == ind_id)


def test_vue_semaine_40_et_comparaison(admin: Api):
    put_validated(admin, 2026, 39, {1: 4, 2: 0})
    put_validated(admin, 2026, 40, {1: 6, 2: 0, 3: None})
    s = admin.get("/api/stats?period=week&year=2026&week=40").json()
    assert s["period"]["start"] == "2026-09-28" and s["period"]["end"] == "2026-10-04"
    r1 = row(s, 1)
    assert r1["value"] == 6 and r1["compare_value"] == 4 and r1["delta"] == 2 and r1["pct"] == 50.0
    assert r1["tone"] == "neutre", "sans sens configuré, aucune couleur favorable/défavorable"
    assert row(s, 2)["value"] == 0 and row(s, 3)["value"] is None
    assert len(s["series"]["points"]) == 12


def test_sens_d_evolution_configure(admin: Api):
    admin.patch("/api/admin/indicators/1", {"direction": "baisse_favorable"})
    put_validated(admin, 2026, 39, {1: 4})
    put_validated(admin, 2026, 40, {1: 6})
    s = admin.get("/api/stats?period=week&year=2026&week=40").json()
    assert row(s, 1)["tone"] == "defavorable"


def test_mois_regle_du_jeudi_et_prorata(admin: Api):
    put_validated(admin, 2026, 39, {1: 7})   # 21/09 → 27/09 : septembre
    put_validated(admin, 2026, 40, {1: 14})  # 28/09 → 04/10 : jeudi 01/10 → octobre
    sept = admin.get("/api/stats?period=month&year=2026&month=9&rule=jeudi").json()
    octo = admin.get("/api/stats?period=month&year=2026&month=10&rule=jeudi").json()
    assert row(sept, 1)["value"] == 7 and row(octo, 1)["value"] == 14
    assert any(x["week"] == 40 for x in sept["straddling"])
    pro = admin.get("/api/stats?period=month&year=2026&month=9&rule=prorata").json()
    assert row(pro, 1)["value"] == 7 + 14 * 3 / 7
    assert pro["rule"] == "prorata"


def test_brouillons_exclus_par_defaut(admin: Api):
    admin.put("/api/bilans/2026/40/draft", {"revision": 0, "rows": [{"indicator_id": 1, "value": 9}]})
    s = admin.get("/api/stats?period=week&year=2026&week=40").json()
    assert row(s, 1)["value"] is None and s["bilans_count"] == 0
    s = admin.get("/api/stats?period=week&year=2026&week=40&drafts=true").json()
    assert row(s, 1)["value"] == 9 and s["drafts_used"] == 1


def test_bilan_rouvert_garde_sa_version_validee(admin: Api):
    put_validated(admin, 2026, 40, {1: 5})
    admin.post("/api/bilans/2026/40/reopen", {"reason": "Vérification"})
    rev = admin.get("/api/bilans/2026/40").json()["revision"]
    admin.put("/api/bilans/2026/40/draft", {"revision": rev, "rows": [{"indicator_id": 1, "value": 50}]})
    s = admin.get("/api/stats?period=week&year=2026&week=40").json()
    assert row(s, 1)["value"] == 5


def test_depuis_toujours_et_annee(admin: Api):
    put_validated(admin, 2025, 50, {1: 1})
    put_validated(admin, 2026, 40, {1: 2})
    s = admin.get("/api/stats?period=all").json()
    assert s["data_range"]["first"] == "2025-12-08" and s["data_range"]["last"] == "2026-10-04"
    assert s["data_range"]["bilans"] == 2 and row(s, 1)["value"] == 3
    y = admin.get("/api/stats?period=year&year=2026").json()
    assert row(y, 1)["value"] == 2


def test_lecteur_peut_consulter_le_tableau_de_bord(reader: Api):
    assert reader.get("/api/stats?period=month&year=2026&month=10").status_code == 200
