# test_optimizer.py
"""
Script para probar el optimizador de parámetros
"""
import os
import sys
from dotenv import load_dotenv
from pathlib import Path
from datetime import datetime, timedelta

# Añadir raíz del proyecto al path
sys.path.insert(0, str(Path(__file__).parent.parent))

from src.utils.logger import log
from src.data.storage import StorageManager
from src.strategies import MovingAverageCrossover
from src.core.optimizer import ParameterOptimizer

def setup_environment():
    """Carga variables de entorno"""
    env_path = Path(__file__).parent.parent / 'config' / 'secrets.env'
    load_dotenv(dotenv_path=env_path)

def test_optimizer():
    """
    Prueba el optimizador con Moving Average Crossover
    """
    log.info("="*70)
    log.info("🔧 TEST: OPTIMIZADOR DE PARÁMETROS")
    log.info("="*70)
    
    # Setup
    setup_environment()
    
    # Cargar datos
    storage = StorageManager(
        db_host=os.getenv('DB_HOST'),
        db_port=int(os.getenv('DB_PORT', 5432)),
        db_name=os.getenv('DB_NAME'),
        db_user=os.getenv('DB_USER'),
        db_password=os.getenv('DB_PASSWORD'),
    )
    
    log.info("\n📥 Cargando datos...")
    # end_date = datetime.now()
    # start_date = end_date - timedelta(days=60)
    
    data = storage.load_ohlcv(
        symbol='BTC/USDT',
        timeframe='1h',
        start_date=None,
        end_date=None,
        use_cache=False
    )
    
    log.success(f"✓ Datos cargados: {len(data)} velas")
    
    # Crear optimizador
    log.info("\n🔧 Creando optimizador...")
    optimizer = ParameterOptimizer(
        strategy_class=MovingAverageCrossover,
        data=data,
        initial_capital=10000,
        commission=0.001
    )
    
    # Definir parámetros a probar (pequeño para empezar)
    param_grid = {
        'fast_period': [10, 15],
        'slow_period': [30, 50],
        'ma_type': ['sma', 'ema'],
        'use_adx': [True],
        'adx_threshold': [20, 25, 30]
    }
    
    log.info(f"\n📊 Grid de parámetros:")
    log.info(f"   fast_period: {param_grid['fast_period']}")
    log.info(f"   slow_period: {param_grid['slow_period']}")
    log.info(f"   ma_type: {param_grid['ma_type']}")
    log.info(f"   Total combinaciones: {3 * 2 * 2} = 12")
    
    # Optimizar
    log.info("\n🚀 Iniciando optimización...")
    results_df = optimizer.optimize(param_grid)
    
    # Mostrar resultados
    log.info("\n📊 RESULTADOS COMPLETOS:")
    print(results_df.to_string(index=False))
    
    # Mejores parámetros
    log.info("\n🏆 ANÁLISIS:")
    best_params = optimizer.get_best_params(metric='sharpe_ratio')
    
    # Guardar resultados (OPCIONAL - ya se guarda por defecto)
    optimizer.save_results()
    
    storage.close()
    
    log.success("\n✅ TEST COMPLETADO")

if __name__ == "__main__":
    test_optimizer()