"""
sf3_day.py -- [2026-10-02] Latest Star Follow version (sf3_batch.py rules: winners-only
references, confirmed marks, market SPY/IWM + gap in the matching (lib_v2), "still matching"
exit with MIN_MATCH) on any symbols of one day, bars fetched from Alpaca.
    python3 sf3_day.py 2026-10-02 UNIT,WNC,CRSR,ONT,HLIT,ARHS [80]
"""
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 sf3_batch as S3
import lib_v2 as L2
import reference as REF
from alpaca_client import get_client

ET = ZoneInfo("America/New_York")


def main(day, syms, min_match):
    S3.MIN_MATCH = min_match
    c = get_client()
    d0 = datetime.fromisoformat(day).replace(tzinfo=ET)
    rows_of = lambda 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)]
    bench = []
    for b in ("SPY", "IWM"):
        by = L2._minutes(rows_of(b)); arr = np.zeros(390, np.float32)
        if by:
            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])
    nb, ns = S3.normal_rates(marks)
    hm = lambda m: f"{9 + (30 + m) // 60}:{(30 + m) % 60:02d}"
    tot = 0
    for s in syms:
        ref = REF.load(day, s)
        a = L2.day_arrays(rows_of(s), ref, day, tuple(bench)) if ref else None
        if a is None:
            print(s, "no data/reference"); continue
        T = S3.run_day(lib, wmask, marks, nb, ns, day, a)
        if not T:
            print(f"{s:5} no trade")
        for t in T:
            tot += t["pl"]
            print(f"{s:5} buy {hm(t['buy_m'])} {t['buy']:.3f} -> sell {hm(t['sell_m'])} {t['sell']:.3f} {t['pl']:+.2f}% [{t['why']}]")
    print(f"TOTAL {tot:+.2f}% (0.1% cost per trade, MIN_MATCH {min_match})")


if __name__ == "__main__":
    main(sys.argv[1], sys.argv[2].split(","), int(sys.argv[3]) if len(sys.argv) > 3 else 80)
