"""Standalone scan runner — cron entry point.

Usage (from backend/):  python -m scanner.run_scan
Runs the full agent pipeline, marks paper trades to market, and generates
the daily report.
"""
from app import models
from app.database import Base, SessionLocal, engine
from app.agents.orchestrator import run_scan_pipeline
from app.services.alerts import alert_closed_trades, alert_new_signals
from app.services.paper_trading import mark_to_market
from app.services.reporting import generate_daily_report


def main() -> None:
    Base.metadata.create_all(bind=engine)
    from app.migrations import run_migrations
    run_migrations(engine)
    db = SessionLocal()
    try:
        run = run_scan_pipeline(db)
        print(f"Scan #{run.id}: {run.universe_size} scanned, "
              f"{run.candidates} candidates, {run.signals_created} signals")
        approved = (
            db.query(models.Signal)
            .filter(models.Signal.scan_run_id == run.id, models.Signal.status == "approved")
            .all()
        )
        closed_now = mark_to_market(db)
        sent = alert_new_signals(db, approved) + alert_closed_trades(db, closed_now)
        if sent:
            print(f"Sent {sent} alert email(s)")
        report = generate_daily_report(db)
        print(report.summary)
    finally:
        db.close()


if __name__ == "__main__":
    main()
