import argparse
import sys
from pathlib import Path

from loguru import logger


def setup_logging():
    logger.remove()
    logger.add(
        sys.stdout,
        colorize=True,
        format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>",
        level="INFO",
    )
    logger.add(
        Path(__file__).parent / "logs" / "neural_backtest.log",
        rotation="10 MB",
        retention="7 days",
        level="INFO",
    )
    logger.add(
        Path(__file__).parent / "logs" / "signals.log",
        rotation="10 MB",
        retention="30 days",
        level="INFO",
        format="{time:YYYY-MM-DD HH:mm:ss} | {level} | {message}",
    )


def parse_args():
    parser = argparse.ArgumentParser(
        description="Neural Network Backtester for MOEX"
    )
    parser.add_argument(
        "--ticker", type=str, default=None,
        help="Ticker symbol (required for backtest/scan modes)"
    )
    parser.add_argument("--tf", type=str, default="H1", help="Timeframe (H1)")
    parser.add_argument(
        "--start", type=str, default="2023-01-01",
        help="Start date (YYYY-MM-DD)"
    )
    parser.add_argument(
        "--end", type=str, default="2024-01-01",
        help="End date (YYYY-MM-DD)"
    )
    parser.add_argument(
        "--capital", type=float, default=1_000_000,
        help="Initial capital"
    )
    parser.add_argument(
        "--risk", type=float, default=0.01,
        help="Risk per trade (0.01 = 1 percent)"
    )
    parser.add_argument(
        "--backtest", action="store_true",
        help="Run backtest mode"
    )
    parser.add_argument(
        "--scan", action="store_true",
        help="Run scanner (live monitoring)"
    )
    parser.add_argument(
        "--interval", type=int, default=60,
        help="Scanner interval (seconds)"
    )
    parser.add_argument(
        "--status-interval", type=int, default=300,
        help="Status log interval in seconds (default: 300 = 5 min)"
    )
    parser.add_argument(
        "--max-positions", type=int, default=5,
        help="Maximum concurrent positions"
    )

    parser.add_argument(
        "--ai-model", type=str, default="",
        help="Neural network model path (default: models/neural_trader.pt for neural, models/neural_trader_strategy.pt for strategy)"
    )
    parser.add_argument(
        "--ai-threshold", type=float, default=0.6,
        help="Minimum entry probability (0-1)"
    )
    parser.add_argument(
        "--min-confidence", type=float, default=0.3,
        help="Minimum model confidence (0-1)"
    )
    parser.add_argument(
        "--sides", type=str, default="LONG,SHORT",
        help="Comma-separated sides to trade (LONG,SHORT)"
    )
    parser.add_argument(
        "--min-signal-gap", type=float, default=0.05,
        help="Minimum probability gap between LONG/SHORT to avoid conflict (0-1)"
    )

    parser.add_argument(
        "--virtual", action="store_true",
        help="Run virtual trading (with position management)"
    )
    parser.add_argument(
        "--strategy", action="store_true",
        help="Use MACD+RSI strategy instead of neural network"
    )

    return parser.parse_args()


def main():
    setup_logging()
    args = parse_args()

    if args.backtest:
        if not args.ticker:
            logger.error("--ticker is required for backtest mode")
            return
        from backtest.cli import run_backtest
        run_backtest(args)
    elif args.scan:
        from scanner.cli import run_scanner
        run_scanner(args)
    else:
        logger.error("Specify --backtest or --scan mode")
        logger.info("Examples:")
        logger.info("  python main.py --backtest --ticker SBER --start 2023-01-01 --end 2024-01-01")
        logger.info("  python main.py --scan --interval 60")
        logger.info("")
        logger.info("To train a model first:")
        logger.info("  python scripts/train_neural_model.py --tickers SBER,GAZP,PLZL")


if __name__ == "__main__":
    main()
