"""Standalone script to scan all coins for range-trading oscillation scores.

Usage:
    python3 scripts/scan_range_trading.py
    python3 scripts/scan_range_trading.py --max-price 1000
    python3 scripts/scan_range_trading.py --timeframe 1D
"""
from __future__ import annotations

import sys
import os
import argparse

sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

from dotenv import load_dotenv
load_dotenv()

from app import create_app
from app.services.oscillation import OscillationAnalyzer


def main():
    parser = argparse.ArgumentParser(description='Scan coins for range-trading suitability')
    parser.add_argument('--max-price', type=float, default=None,
                        help='Max price in IDR (default: scan all)')
    parser.add_argument('--timeframe', type=str, default='1D',
                        help='OHLCV timeframe (default: 1D)')
    parser.add_argument('--asset-type', default='stock',
                        choices=['crypto', 'stock', 'stock_us'],
                        help='Asset type (default: stock)')
    args = parser.parse_args()

    app = create_app()
    with app.app_context(), app.test_request_context():
        from flask import session
        session['asset_mode'] = args.asset_type
        from app.helpers.market_db import switch_market_schema
        switch_market_schema(args.asset_type)
        analyzer = OscillationAnalyzer()
        scored = 0
        total = 0

        for event in analyzer.scan_all_coins_sse(args.max_price, args.timeframe):
            evt_type = event.get('type')
            if evt_type == 'start':
                total = event['total']
                print(f"🔍 {event['message']}")
            elif evt_type == 'scored':
                scored += 1
                sym = event.get('symbol', '?')
                score = event.get('score', 0)
                pct = event['processed'] / event['total'] * 100
                print(f"  ✓ [{event['processed']}/{event['total']}] {sym:<10} Score: {score:.1f}  ({pct:.0f}%)")
            elif evt_type == 'skip':
                sym = event.get('symbol', event.get('coin_id', '?'))
                print(f"  ⊘ [{event['processed']}/{event['total']}] {sym:<10} — {event['reason']}")
            elif evt_type == 'error':
                name = event.get('name', event.get('coin_id', '?'))
                print(f"  ✗ [{event['processed']}/{event['total']}] {name:<10} — {event['error']}")
            elif evt_type == 'done':
                print(f"\n✅ {event['message']}")

        print(f"\nSelesai: {scored} scored dari {total} koin.")


if __name__ == '__main__':
    main()
