"""Digest quotidien compact — le format pensé pour économiser les tokens.

Au lieu de lancer 4 outils et de déverser des tableaux de 50 lignes, on produit
un résumé court (~20 lignes) : état du portefeuille, top opportunités filtrées,
alertes déclenchées. Écrit dans reports/ et renvoyé comme texte court.
"""
from __future__ import annotations

import datetime as dt
import os
from pathlib import Path

from . import alerts, data, scanner, tracker

# Écrit dans FINLAB_HOME/reports si défini (workspace inscriptible) — cf. data.ROOT.
REPORTS_DIR = Path(os.environ.get("FINLAB_HOME") or Path(__file__).resolve().parent.parent) / "reports"


def build(theme: str = "all", target_pct: float = 5.0, top: int = 6) -> str:
    today = dt.date.today().isoformat()
    lines = [f"# Digest {today}", ""]

    # --- Portefeuille (1 ligne d'essentiel) ---
    try:
        _, agg = tracker.build(with_sector=True)
        b = agg["base"]
        top_sec = agg["by_sector"].index[0]
        top_sec_w = agg["by_sector"].iloc[0]
        lines.append(
            f"**Portefeuille** : {agg['total']:,.0f} {b} | P&L {agg['pnl_total']:+,.0f} {b} "
            f"({agg['pnl_pct']:+.1f}%) | cash {agg['cash']:,.0f} {b}"
        )
        lines.append(f"Concentration : {top_sec} {top_sec_w:.0f}%")
    except Exception as e:
        lines.append(f"_Portefeuille indisponible : {e}_")

    # --- Opportunités (seulement les actionnables, colonnes minimales) ---
    lines += ["", f"## Opportunités haussières ({theme}, cible {target_pct:.0f}%)", ""]
    try:
        df = scanner.scan_theme(theme, target_pct, bullish_only=True)
        cap_col = f"peut_{int(target_pct)}%"
        df = df[df[cap_col] == "OUI"].head(top)
        if df.empty:
            lines.append("_Aucune opportunité haussière qualifiée aujourd'hui._")
        else:
            for _, r in df.iterrows():
                lines.append(
                    f"- **{r['ticker']}** {r['cours']} | range/sem {r['range_sem_%']}% | "
                    f"RSI {r['RSI']:.0f} MACD {r['MACD']} | {r['biais']}"
                )
    except Exception as e:
        lines.append(f"_Scan indisponible : {e}_")

    # --- Alertes (événements du jour uniquement) ---
    lines += ["", "## Alertes du jour", ""]
    try:
        hits = alerts.run()
        if not hits:
            lines.append("_Aucune._")
        else:
            for h in sorted(hits, key=lambda x: x["alerte"]):
                lines.append(f"- {h['alerte']} — **{h['ticker']}** ({h['prix']})")
    except Exception as e:
        lines.append(f"_Alertes indisponibles : {e}_")

    return "\n".join(lines)


def write(theme: str = "all", target_pct: float = 5.0) -> Path:
    """Génère le digest et l'écrit dans reports/digest_<date>.md."""
    REPORTS_DIR.mkdir(exist_ok=True)
    text = build(theme, target_pct)
    path = REPORTS_DIR / f"digest_{dt.date.today().isoformat()}.md"
    path.write_text(text, encoding="utf-8")
    (REPORTS_DIR / "latest.md").write_text(text, encoding="utf-8")
    return path


if __name__ == "__main__":
    import sys
    theme = sys.argv[1] if len(sys.argv) > 1 else "all"
    p = write(theme)
    print(p.read_text(encoding="utf-8"))
    print(f"\n[écrit dans {p}]")
