"""AI CIO briefing + Trade Readiness Score tests."""
from fastapi.testclient import TestClient

from app.main import app
from app.services.briefing import trading_mode, readiness_score
from app import models

client = TestClient(app)


def test_trading_mode_defensive_conditions():
    mode, reasons = trading_mode("chop", False, 20.0, 60.0)
    assert mode == "Defensive" and any("chop" in r.lower() for r in reasons)
    mode, _ = trading_mode("bull", True, 20.0, 60.0)
    assert mode == "Defensive"           # high volatility
    mode, _ = trading_mode("bull", False, 85.0, 60.0)
    assert mode == "Defensive"           # risk budget nearly exhausted
    mode, _ = trading_mode("bull", False, 20.0, 40.0)
    assert mode == "Defensive"           # poor recent win rate


def test_trading_mode_aggressive_and_moderate():
    mode, _ = trading_mode("bull", False, 20.0, 65.0)
    assert mode == "Aggressive"
    mode, _ = trading_mode("bull", False, 55.0, 55.0)
    assert mode == "Moderate"


def _signal(direction="CALL", **overrides) -> models.Signal:
    base = dict(symbol="TSLA", company="Tesla", direction=direction, status="approved",
                risk_rating="medium", price=100.0, confidence=80.0, probability=62.0,
                entry=100.0, stop_loss=95.0, target1=110.0, target2=115.0,
                risk_reward=2.0, position_size=100, max_risk_usd=500.0,
                scores={"technical": 75.0, "volatility": 70.0, "options": 65.0})
    base.update(overrides)
    return models.Signal(**base)


def test_readiness_score_bounds_and_alignment():
    s = _signal()
    bull = readiness_score(s, "bull")     # CALL in bull = aligned (+5)
    chop = readiness_score(s, "chop")     # chop = -5
    assert 0 <= bull["total"] <= 100
    assert bull["total"] > chop["total"]
    assert bull["regime_alignment"] == 5.0
    assert chop["regime_alignment"] == -5.0
    assert set(bull["breakdown"]) == {"setup", "confidence", "probability",
                                      "risk_reward", "volatility", "options"}


def test_readiness_rewards_better_signals():
    strong = _signal(confidence=92.0, probability=70.0, risk_reward=3.0,
                     scores={"technical": 90.0, "volatility": 85.0, "options": 80.0})
    weak = _signal(confidence=55.0, probability=50.0, risk_reward=2.0,
                   scores={"technical": 50.0, "volatility": 40.0, "options": 45.0})
    assert readiness_score(strong, "bull")["total"] > readiness_score(weak, "bull")["total"]


def test_briefing_endpoint():
    client.post("/api/scanner/run")
    r = client.get("/api/dashboard/briefing")
    assert r.status_code == 200
    b = r.json()
    assert b["trading_mode"] in ("Aggressive", "Moderate", "Defensive")
    assert b["regime"] in ("bull", "bear", "chop", "unknown")
    assert isinstance(b["briefing"], list) and len(b["briefing"]) >= 4
    assert "not financial advice" in b["briefing"][-1]
    # opportunities sorted by readiness
    readiness = [o["readiness"] for o in b["top_opportunities"]]
    assert readiness == sorted(readiness, reverse=True)
