"""Daily report for you, plus an optional push to Saali Primax (the master agent)."""
import json
import os
import urllib.request
import pandas as pd
from .config import REPORTS
from .gate import evaluate
from .metrics import summarize


def build_report(j, version, cfg, equity=None):
    row = j.version(version)
    trades = j.trades(version, "closed")
    s = summarize(trades, row["start_equity"], j.equity_series(version))
    today = str(pd.Timestamp.now(tz="UTC").date())
    todays = [t for t in trades if str(t["exit_time"]).startswith(today)]
    ts = summarize(todays)
    gate = evaluate(j, version, cfg)
    eq = equity if equity is not None else (j.equity_series(version) or [row["start_equity"]])[-1]
    data = {
        "date": today, "agent": "Sailar-x", "mode": cfg["mode"], "version": version,
        "equity": round(eq, 2), "start_equity": row["start_equity"],
        "return_pct": round((eq / row["start_equity"] - 1) * 100, 2) if row["start_equity"] else 0,
        "all_time": s, "today": ts, "gate": gate,
        "previous_versions": j.all_versions(),
        "problems": j.events(10, "CRASH"),
    }
    md = [f"# Sailar-x daily report: {today}",
          f"**Mode:** {cfg['mode']}  |  **Strategy version:** v{version}  |  **Equity:** {data['equity']} ({data['return_pct']:+}%)",
          "", "## Today", f"- Trades closed: {ts['trades']}  |  P&L: {ts['net_pnl']:+}",
          "", "## Since this version started",
          f"- Trades: {s['trades']}  |  Win rate: {s['win_rate']:.0%}  |  Profit factor: {s['profit_factor']}",
          f"- Net P&L after fees: {s['net_pnl']:+}  |  Max drawdown: {s['max_drawdown_pct']}%",
          "", f"## Go-live gate: {'PASSED' if gate['passed'] else 'not yet'}"]
    md += [f"- [{'x' if c['ok'] else ' '}] {c['name']}: {c['detail']}" for c in gate["checks"]]
    if row["findings"]:
        md += ["", "## Why this version exists (autopsy of its parent)"] + [f"- {f}" for f in row["findings"]]
    if data["problems"]:
        md += ["", "## Problems"] + [f"- {p['ts']}: {p['msg'][:120]}" for p in data["problems"]]
    return "\n".join(md), data


def save_and_send(j, version, cfg, equity=None):
    md, data = build_report(j, version, cfg, equity)
    path = REPORTS / f"{data['date']}.md"
    path.write_text(md)
    (REPORTS / f"{data['date']}.json").write_text(json.dumps(data, indent=2, default=str))
    url = os.environ.get("PRIMAX_URL")
    if url:
        try:
            req = urllib.request.Request(url, json.dumps(data, default=str).encode(),
                                         {"Content-Type": "application/json",
                                          "Authorization": f"Bearer {os.environ.get('PRIMAX_TOKEN', '')}"})
            urllib.request.urlopen(req, timeout=15).read()
        except Exception as e:  # never let reporting stop trading
            j.event("WARN", f"could not send report to Primax: {e}")
    return path
