# server_to_server.py
import requests
from datetime import datetime, timedelta
import csv

# URL de tu endpoint Flask — ajusta puerto si hace falta
BASE_URL = "http://127.0.0.1:5000/backtestingIdea/get_backtesting_idea"

# 🗓️ Lista de rangos de fechas a analizar
rangos = [
#     ("2025-02-08", "2025-05-09"),
#     ("2025-02-15", "2025-05-16"),
#     ("2025-02-22", "2025-05-23"),
#     ("2025-03-01", "2025-05-30"),
#     ("2025-03-08", "2025-06-06"),
#     ("2025-03-15", "2025-06-13"),
#     ("2025-03-22", "2025-06-20"),
#     ("2025-03-29", "2025-06-27"),
#     ("2025-04-05", "2025-07-04"),
#     ("2025-04-12", "2025-07-11"),
#     ("2025-04-19", "2025-07-18"),
#     ("2025-04-26", "2025-07-25"),
#     ("2025-05-03", "2025-08-01"),
#     ("2025-05-10", "2025-08-08"),
#     ("2025-05-17", "2025-08-15"),
#     ("2025-05-24", "2025-08-22"),
#     ("2025-05-31", "2025-08-29"),
#     ("2025-06-07", "2025-09-05"),
#     ("2025-06-14", "2025-09-12"),
#     ("2025-06-21", "2025-09-19"),
#     ("2025-06-28", "2025-09-26"),
#     ("2025-07-05", "2025-10-03"),
#     ("2025-07-12", "2025-10-10"),
#     ("2025-07-19", "2025-10-17"),
#     ("2025-07-26", "2025-10-24"),
#     ("2025-08-02", "2025-10-31"),
#     ("2025-08-09", "2025-11-07"),
#     ("2025-08-16", "2025-11-14"),
#     ("2025-08-23", "2025-11-21"),
#     ("2025-08-30", "2025-11-28"),
#     ("2025-09-06", "2025-12-05"),
#     ("2025-09-13", "2025-12-12"),
#     ("2025-09-20", "2025-12-19"),
#     ("2025-09-27", "2025-12-26"),
#     ("2025-10-04", "2026-01-02"),
#     ("2025-10-11", "2026-01-09"),
#     ("2025-10-18", "2026-01-16"),
#     ("2025-10-25", "2026-01-23"),
#     ("2025-11-01", "2026-01-30"),
#     ("2025-11-08", "2026-02-06"),
#     ("2025-11-15", "2026-02-13"),    
#     ("2025-11-22", "2026-02-20"),
#     ("2025-11-29", "2026-02-27"),
      ("2025-12-06", "2026-03-06"),

]


# 🕒 Rango horario: 10:05 a 15:00 en pasos de 5 min
HORA_INICIO_STR = "10:05"
HORA_FIN_STR = "15:00"

# 📊 Configuración de estrategias y riesgos por símbolo
CONFIGURACIONES = {
    "Vertical": {
        "SPX": ["ultra_agresivo"],
        # "RUT": ["agresivo", "intermedio", "conservador"],
        # "XSP": ["agresivo", "intermedio", "conservador"]
    },
    "IronCondor": {
        # "SPX": ["agresivo", "intermedio", "conservador"],
        # "RUT": ["intermedio", "conservador"],
        # "XSP": ["intermedio", "conservador"]
    }
}

# 🕑 Tiempo inicial total
start_time_global = datetime.now()

for desde, hasta in rangos:
    print(f"\n🚀 Comenzando análisis desde {desde} hasta {hasta}\n")

    # Iterar por estrategia
    for estrategia, symbols_config in CONFIGURACIONES.items():

        # Iterar por símbolo
        for symbol, risks in symbols_config.items():

            # Iterar por nivel de riesgo
            for risk in risks:
                print(f"\n{'='*70}")
                print(f"📊 Procesando: {symbol} | Estrategia: {estrategia} | Riesgo: {risk}")
                print(f"{'='*70}\n")

                # Reiniciar rango horario y contenedores por cada risk
                hora_inicio = datetime.strptime(HORA_INICIO_STR, "%H:%M")
                hora_fin = datetime.strptime(HORA_FIN_STR, "%H:%M")
                resultados = []

                while hora_inicio <= hora_fin:
                    hora_str = hora_inicio.strftime("%H%M")  # → "1005"

                    params = {
                        "desde": desde,
                        "hasta": hasta,
                        "symbol": symbol,
                        "estrategia": estrategia,
                        "hora": hora_str,
                        "risk": risk
                    }

                    print(f"🕒 Probando hora: {hora_str} ...")

                    try:
                        response = requests.get(BASE_URL, params=params, timeout=60)
                        response.raise_for_status()
                        data = response.json()

                        # Logs de control
                        if data.get("data"):
                            print(f"   ➜ Ideas válidas: {len(data['data'])}")
                        else:
                            print(f"   ⚠️  Sin resultados para esta hora.")

                        profit = data.get("profit_total", 0)
                        wins = data.get("wins", 0)
                        losses = data.get("losses", 0)

                        print(f"   ➜ Profit total: {profit} | Wins: {wins} | Losses: {losses}")

                        resultados.append({
                            "hora": hora_str,
                            "profit": profit,
                            "wins": wins,
                            "losses": losses
                        })

                    except Exception as e:
                        print(f"[ERROR] Hora {hora_str}: {e}")

                    hora_inicio += timedelta(minutes=5)

                # 🏆 Determinar mejor resultado por risk
                mejor = max(resultados, key=lambda x: x["profit"], default=None)

                print("\n✅ Mejor horario encontrado:")
                if mejor is not None:
                    print(f"   ➜ Hora: {mejor['hora']}")
                    print(f"   ➜ Profit: {mejor['profit']}")
                    print(f"   ➜ Wins: {mejor['wins']} | Losses: {mejor['losses']}")
                else:
                    print("   ➜ No hubo resultados.")

                # Nombre de archivo incluye rango de fechas + risk
                filename = f"resultados_backtesting_{risk[:4]}_{symbol}_{desde}_{hasta}_{estrategia}__.csv"

                # 🗂️ Guardar auditoría en CSV por risk
                with open(filename, "w", newline="") as csvfile:
                    fieldnames = ["hora", "profit", "wins", "losses"]
                    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
                    writer.writeheader()
                    for fila in resultados:
                        writer.writerow(fila)

                print(f"\n📁 Resultados guardados en: {filename}\n")

# ⏱️ Tiempo total
end_time_global = datetime.now()
elapsed = end_time_global - start_time_global
elapsed_str = str(elapsed).split(".")[0]  # hh:mm:ss sin microsegundos
print(f"⏱️ Tiempo total transcurrido: {elapsed_str}\n")
