"""
run_scanner.py

Standalone entry point for this project's first piece: the scanner.

    python run_scanner.py

Pulls the universe, prefilters by snapshot, scores every survivor
against the breakout candidate model, and writes/prints the ranked
list. Does not buy anything and does not touch screener/premarket in
any way -- separate process, separate config, separate data/ and logs/.
"""

from alpaca_client import get_client
import universe
import scanner
import data_store


def main():
    data_store.ensure_dirs()
    client = get_client()

    all_symbols = universe.get_universe_symbols(client)
    print(f"Universe size after asset filtering: {len(all_symbols)}")

    volume_baselines = {}
    prev_day_highs = {}
    prev_closes = {}
    prefiltered = universe.prefilter_by_snapshot(
        client, all_symbols,
        baseline_out=volume_baselines,
        prev_day_high_out=prev_day_highs,
        prev_close_out=prev_closes,
    )
    print(f"Prefiltered to {len(prefiltered)} symbols in price/volume band")

    range_20d_highs = scanner.compute_range_20d_high(client, prefiltered)

    results = scanner.scan(
        client,
        prefiltered=prefiltered,
        volume_baselines=volume_baselines,
        prev_day_highs=prev_day_highs,
        prev_closes=prev_closes,
        range_20d_highs=range_20d_highs,
    )

    print(f"\n{'Symbol':<8}{'Score':>8}{'Price':>10}{'Gap%':>8}{'RVOL':>8}{'PMVol':>12}")
    for r in results:
        m = r["metrics"]
        print(f"{r['symbol']:<8}{r['candidate_score']:>8.2f}{m['price']:>10.2f}"
              f"{m['gap_pct']:>8.2f}{m['rvol']:>8.2f}{m['premarket_volume']:>12.0f}")


if __name__ == "__main__":
    main()
