# main.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import logging
import sys
import os

from config import MLFLOW_DB
from src.data.loader import fetch_ohlcv
from src.data.features import engineer_features
from src.training.ensemble import train_ensemble
from src.inference.predictor import predict_ensemble
from src.monitoring.monitor import monitor_summary, visualize
from src.inference.backtest import backtest_ensemble

logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s | %(levelname)-8s | %(message)s'
)
logger = logging.getLogger(__name__)


def main():
    parser = argparse.ArgumentParser(description='MOEX/Crypto Ensemble LSTM Dual-Direction Estimator')
    parser.add_argument('--instrument', type=str, required=True, help='Тикер инструмента')
    parser.add_argument('--timeframe', type=str, required=True, choices=['H1', 'D1', 'W1'], help='Таймфрейм')
    parser.add_argument('--mode', type=str, required=True, choices=['train', 'predict', 'monitor', 'viz', 'backtest'],
                        help='Режим работы')
    parser.add_argument('--rr', type=float, default=3.0, help='Соотношение Risk/Reward')
    parser.add_argument('--mlflow_db', type=str, default=MLFLOW_DB, help='Путь к mlflow.db')
    args = parser.parse_args()

    if not os.getenv("DB_PASSWORD"):
        logger.error("❌ DB_PASSWORD not set. See .env.example")
        sys.exit(1)

    df = fetch_ohlcv(args.instrument, args.timeframe)
    df = engineer_features(df, window=20, rr_ratio=args.rr)

    if args.mode == 'train':
        train_ensemble(df, args)
    elif args.mode == 'predict':
        predict_ensemble(args.instrument, args.timeframe, args.rr, args.mlflow_db)
    elif args.mode == 'monitor':
        monitor_summary()
    elif args.mode == 'viz':
        visualize(args.instrument, args.timeframe)
    elif args.mode == 'backtest':
        backtest_ensemble(args.instrument, args.timeframe, args.rr)


if __name__ == "__main__":
    main()
