"""
sf4_day.py -- [2026-10-02] Star Follow WINNERS vs LOSERS (sf4_batch.py rules, both variants) on
every stock the trade bot watched on a day; buys only while the bot watched that stock.
    python3 sf4_day.py 2026-10-02
"""
import json
import sys
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

import numpy as np

HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE)); sys.path.insert(0, "/var/www/screener/trade")
import lib_v2 as L2
import sf3_batch as S3
import sf4_batch as S4
import sf_watchlist_day as WL
import reference as REF
from alpaca_client import get_client

ET = ZoneInfo("America/New_York")
hm = lambda m: f"{9 + (30 + m) // 60}:{(30 + m) % 60:02d}"


def main(day):
    win = WL.windows(day); syms = list(win)
    c = get_client(); d0 = datetime.fromisoformat(day).replace(tzinfo=ET)
    rows = {s: [[b.timestamp, float(b.open), float(b.high), float(b.low), float(b.close), float(b.volume)]
                for b in c.get_minute_bars(s, start=d0.replace(hour=9, minute=30), end=d0.replace(hour=16), limit=1000)]
            for s in syms + ["SPY", "IWM"]}
    bench = []
    for b in ("SPY", "IWM"):
        by = L2._minutes(rows[b]); arr = np.zeros(390, np.float32); o = by[min(by)][1]; last = o
        for m in range(390):
            last = by[m][4] if m in by else last; arr[m] = (last / o - 1) * 100
        bench.append(arr)
    lib = L2.Lib(); marks = S3.load(); wmask = np.array([k in marks for k in lib.keys]); base = float(wmask.mean())
    nb, ns = S3.normal_rates(marks)
    res = {"majority": [], "normal": []}
    for s in syms:
        ref = REF.load(day, s)
        a = L2.day_arrays(rows[s], ref, day, tuple(bench)) if ref else None
        if a is None:
            continue
        ok = lambda m, w=win[s]: any(x <= m < y for x, y in w)
        for rule in res:
            res[rule] += [{"day": day, "sym": s, **t} for t in S4.run_day(lib, wmask, marks, nb, ns, day, a, rule, base, can_buy=ok)]
    json.dump(res, open(HERE / f"sf4_watchlist_{day}.json", "w"), default=float)
    print(f"{len(syms)} watched stocks on {day}; normal winner share {base:.0%}")
    for rule, T in res.items():
        S4.report(f"{rule.upper()}", T, [day])
        for t in sorted(T, key=lambda t: -t["pl"]):
            print(f"   {t['sym']:5} {hm(t['buy_m'])} {t['buy']:.2f} -> {hm(t['sell_m'])} {t['sell']:.2f} {t['pl']:+.2f}% "
                  f"[{t['why']}] (winners at buy {t['share_buy']:.0%})")


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