"""
full_report.py -- [2026-09-28] AGEN-style full report for any symbols:
week overview (6-session chart + daily table incl. premarket), all news for
the week, and a day_report.py section for today and each of the 5 prior days.

    python3 full_report.py 2026-09-28 INLF YDES   -> reports/<SYM>_week_to_<date>_report.pdf per symbol
"""
import subprocess
import sys
from datetime import datetime, timedelta
from pathlib import Path
from zoneinfo import ZoneInfo

import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt

HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
import day_report as R
from alpaca_client import get_client

ET = ZoneInfo("America/New_York")
MD2PDF = "/tmp/claude-0/-var-www-screener-trade/5844eef7-c648-46de-a03c-fe0b1434b640/scratchpad/md2pdf.py"


def sessions(sym, day, n=6):
    c = get_client()
    d = datetime.fromisoformat(day).replace(tzinfo=ET)
    daily = c.get_daily_bars_bulk([sym], d - timedelta(days=20), d + timedelta(hours=20)).get(sym, [])
    days = [b["t"].astimezone(ET).date().isoformat() for b in daily]
    days = [x for x in days if x <= day][-n:]
    return days, daily


def main(day, syms):
    days_all = {}
    for s in syms:
        days_all[s] = sessions(s, day)
    for dd in sorted({x for s in syms for x in days_all[s][0]}):
        R.WANT.update(syms)
    for s in syms:
        days, daily = days_all[s]
        rows, secs, closes = [], [], []
        for dd in days:
            m = R.load_minutes(s, dd)
            reg = [r for r in m if r["session"] == "reg"]
            pre = [r for r in m if r["session"] == "pre"]
            f = lambda r, k: float(r[k])
            prev = [b for b in daily if b["t"].astimezone(ET).date().isoformat() < dd]
            pc = prev[-1]["c"] if prev else None
            o, cl = f(reg[0], "open"), f(reg[-1], "close")
            hi = max(reg, key=lambda r: f(r, "high"))
            lo = min(reg, key=lambda r: f(r, "low"))
            rows.append(f"| {dd[5:]} | {pc if pc else '—'} | {max((f(r,'high') for r in pre), default=0):.2f} / "
                        f"{int(sum(f(r,'volume') for r in pre)/1000)}k | {o:.2f} | {f(lo,'low'):.2f} ({lo['time_et']}) | "
                        f"{f(hi,'high'):.2f} ({hi['time_et']}) | {cl:.2f} | {(cl/o-1)*100:+.1f}% | "
                        f"{(cl/pc-1)*100:+.1f}% | {(f(hi,'high')/f(lo,'low')-1)*100:.1f}% | "
                        f"{sum(f(r,'volume') for r in reg)/1e6:.2f}M |" if pc else "")
            closes.append((dd, m))
        # 6-session chart
        fig, ax = plt.subplots(1, len(closes), figsize=(11, 3.4), sharey=True)
        for i, (dd, m) in enumerate(closes):
            ax[i].plot(range(len(m)), [float(r["close"]) for r in m], lw=0.8, color="#1f3a5f")
            ax[i].axvspan(0, sum(1 for r in m if r["session"] == "pre"), color="#eeeeee")
            reg = [r for r in m if r["session"] == "reg"]
            ax[i].set_title(f"{dd[5:]}  {(float(reg[-1]['close'])/float(reg[0]['open'])-1)*100:+.1f}%", fontsize=9)
            ax[i].set_xticks([])
            ax[i].grid(alpha=.3)
        fig.suptitle(f"{s} — last {len(closes)} sessions, premarket (grey) + regular session (open→close %)", fontsize=10)
        plt.tight_layout()
        png6 = HERE / f"{s}_6days.png"
        plt.savefig(png6, dpi=120)
        plt.close()
        # news for the whole week
        news = R.news_for(s, day, days_before=10)
        L = [f"# {s} — Full Report, {days[0]} to {day}", "",
             "Same format as the AGEN report: week overview, all news, and a full section for each session (premarket-to-close chart with VWAP and the bot's trades, price vs the open and VWAP, volume by hour, scanner ranks, bot entry checks, trades, news). Source: Alpaca SIP 1-minute bars and Alpaca's news feed (Benzinga); the live bot's lists, decision logs and trade logs.", "",
             "## The last 6 sessions", "", f"![]({png6})", "",
             "| Day | Prev close | Premarket high / volume | Open | Low (time) | High (time) | Close | Open→close | Day change | Range | Volume |",
             "|---|---|---|---|---|---|---|---|---|---|---|"] + [r for r in rows if r] + ["",
             "## All news (10 days before through today's close)", ""]
        L += [f"- **{t}** — {h} ({src})" for t, h, src, url in news] or ["No news items found."]
        L += ["", "---", ""]
        for dd in reversed(days):
            L.append(R.section(s, dd))
            L.append("\n---\n")
        mdp = HERE / f"{s}_full_report.md"
        mdp.write_text("\n".join(L))
        pdf = HERE.parent / f"{s}_week_to_{day}_report.pdf"
        subprocess.run([sys.executable, MD2PDF, str(mdp), str(pdf), f"{s} Full Report to {day}"], check=True)
        print("wrote", pdf, flush=True)


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2:])
