"""Trading Signals Scan — generate sinyal trading (31 algo + ML) untuk semua coin.

Menggunakan ScoringService.scan_signals_sse() yang:
  1. Auto-evaluates past signal outcomes (feeds Kelly Criterion & adaptive weights)
  2. Deletes old active signals
  3. Runs full 31-algorithm TradingEngine + ML per coin
  4. Generates & saves TradingSignal records (BUY/SELL/HOLD)

Setiap signal menyertakan: entry price, stop loss, take profit, confidence,
safety rating, recommended strategy, dan market regime.

Ini adalah versi CLI dari tombol "Trading Signals Scan" di halaman /admin/ml.

Usage:
    # Scan semua coin (timeframe 1D)
    python3 scripts/scan_trading_signals.py

    # Timeframe tertentu
    python3 scripts/scan_trading_signals.py --timeframe 4h

    # Timeframe 1h
    python3 scripts/scan_trading_signals.py --timeframe 1h

    # Quiet mode (untuk cron)
    python3 scripts/scan_trading_signals.py --quiet

Cron example:
    # Generate sinyal setiap 4 jam
    0 */4 * * * cd /path && .venv/bin/python scripts/scan_trading_signals.py --quiet >> logs/scan_signals.log 2>&1

    # Sinyal harian jam 6 pagi
    0 6 * * * cd /path && .venv/bin/python scripts/scan_trading_signals.py --timeframe 1D --quiet >> logs/scan_signals.log 2>&1
"""
from __future__ import annotations

import argparse
import os
import sys
import time

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

from dotenv import load_dotenv
load_dotenv()


def main():
    parser = argparse.ArgumentParser(
        description='Generate sinyal trading (31 algo + ML) untuk semua coin',
        formatter_class=argparse.RawDescriptionHelpFormatter,
    )
    parser.add_argument('--timeframe', default='1D',
                        choices=['1m', '15m', '30m', '1h', '4h', '1D', '1W'],
                        help='OHLCV timeframe (default: 1D)')
    parser.add_argument('--asset-type', default='stock',
                        choices=['crypto', 'stock', 'stock_us'],
                        help='Asset type (default: stock)')
    parser.add_argument('--quiet', '-q', action='store_true',
                        help='Quiet — hanya summary')
    args = parser.parse_args()

    from app import create_app
    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)
        from app.services.scorer import ScoringService

        svc = ScoringService()
        scored = 0
        skipped = 0
        failed = 0
        total = 0
        buy_count = 0
        sell_count = 0
        start_time = time.time()

        if not args.quiet:
            print(f'\n🎯  Trading Signals Scan — timeframe: {args.timeframe}')
            print(f'{"─" * 70}')

        for event in svc.scan_signals_sse(args.timeframe):
            evt_type = event.get('type')

            if evt_type == 'start':
                total = event['total']
                if not args.quiet:
                    print(f'  {event["message"]}')
                    print()

            elif evt_type == 'info':
                if not args.quiet:
                    print(f'  ℹ  {event.get("message", "")}')

            elif evt_type == 'scored':
                scored += 1
                signal = event.get('signal', '?')
                if signal == 'BUY':
                    buy_count += 1
                elif signal == 'SELL':
                    sell_count += 1

                if not args.quiet:
                    sym = event.get('symbol', '?')
                    score = event.get('score', 0)
                    strategy = event.get('strategy', '')
                    regime = event.get('regime', '')
                    eta = event.get('eta', '')
                    pct = event['processed'] / event['total'] * 100

                    if signal == 'BUY':
                        icon = '🟢'
                    elif signal == 'SELL':
                        icon = '🔴'
                    else:
                        icon = '🟡'

                    print(f'  {icon} [{event["processed"]}/{event["total"]}] '
                          f'{sym:<10} {signal:<4} score={score:<4.0f} '
                          f'regime={regime:<14} '
                          f'strategy={strategy[:20]:<20}  '
                          f'ETA={eta}  ({pct:.0f}%)')

            elif evt_type == 'skip':
                skipped += 1
                if not args.quiet:
                    sym = event.get('symbol', event.get('coin_id', '?'))
                    print(f'  ⊘  [{event["processed"]}/{event["total"]}] '
                          f'{sym:<10} — {event.get("reason", "skipped")}')

            elif evt_type == 'error':
                failed += 1
                if not args.quiet:
                    sym = event.get('symbol', event.get('coin_id', '?'))
                    print(f'  ✗  [{event["processed"]}/{event["total"]}] '
                          f'{sym:<10} — {event.get("error", "error")}')

            elif evt_type == 'done':
                pass  # Summary printed below

        elapsed = time.time() - start_time
        mins = int(elapsed // 60)
        secs = int(elapsed % 60)

        hold_count = scored - buy_count - sell_count

        print(f'\n{"═" * 70}')
        print(f'🎯  Trading Signals Scan Complete — {mins}m {secs}s')
        print(f'    Timeframe: {args.timeframe}  |  Signals: {scored}  |  '
              f'Skipped: {skipped}  |  Failed: {failed}  |  Total: {total}')
        print(f'    🟢 BUY: {buy_count}  |  🔴 SELL: {sell_count}  |  '
              f'🟡 HOLD: {hold_count}')
        print(f'{"═" * 70}')

        sys.exit(1 if failed > total * 0.5 else 0)


if __name__ == '__main__':
    main()
