"""
scanner.py — scan watchlist.txt and run bot.py on the best RVOL setup.
Uses IBKR market data (daily bars) instead of yfinance.
"""
import os
import subprocess
import sys
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

from dotenv import load_dotenv

load_dotenv(Path(".env"))
sys.path.insert(0, str(Path(__file__).parent))

from src.ibkr_client import IBKRClient

ET = ZoneInfo("America/New_York")

def ts():
    return datetime.now(ET).strftime("[%H:%M:%S ET]")

host      = os.getenv("IBKR_HOST", "127.0.0.1")
port      = int(os.getenv("IBKR_PORT", 7497))
client_id = int(os.getenv("IBKR_CLIENT_ID", 2))

# Load watchlist
watchlist_path = Path("watchlist.txt")
if not watchlist_path.exists():
    print(f"{ts()} watchlist.txt not found.")
    sys.exit(1)

symbols = [
    s.strip().split()[0].upper()
    for s in watchlist_path.read_text().splitlines()
    if s.strip() and not s.strip().startswith("#")
]
symbols = list(dict.fromkeys(symbols))
print(f"{ts()} Scanning {len(symbols)} symbols: {symbols}")

print(f"{ts()} Connecting to IBKR...")
try:
    ibkr = IBKRClient(host, port, client_id)
except Exception as e:
    print(f"{ts()} IBKR connection failed: {e}")
    sys.exit(1)

scored = []
for symbol in symbols:
    try:
        df = ibkr.get_daily_bars(symbol, days=16)
        if df is None or len(df) < 2:
            print(f"{ts()} {symbol:6s} — no daily bars")
            continue

        today_price = float(df["Close"].iloc[-1])
        avg_vol     = float(df["Volume"].iloc[:-1].mean())
        today_vol   = float(df["Volume"].iloc[-1])
        rvol        = (today_vol / avg_vol) if avg_vol > 0 else 0.0

        print(f"{ts()} {symbol:6s} price=${today_price:.2f} rvol={rvol:.2f}x")

        if 1.0 <= today_price <= 20.0:
            scored.append((symbol, today_price, rvol))
    except Exception as e:
        print(f"{ts()} {symbol} error: {e}")

ibkr.disconnect()

if not scored:
    print(f"{ts()} No qualifying symbols found.")
    sys.exit(0)

scored.sort(key=lambda x: x[2], reverse=True)
best_symbol, best_price, best_rvol = scored[0]
print(f"{ts()} Best setup: {best_symbol} price=${best_price:.2f} rvol={best_rvol:.2f}x")

cmd = [sys.executable, "bot.py", "--symbol", best_symbol]
print(f"{ts()} Running: {' '.join(cmd)}")
try:
    proc = subprocess.run(cmd, timeout=60, text=True)
    sys.exit(proc.returncode)
except subprocess.TimeoutExpired:
    print(f"{ts()} bot.py timed out.")
    sys.exit(1)
