# 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:5002/backtestingIdea/get_backtesting_idea"

# 🗓️ Lista de duplas de días 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-09-06", "2025-12-05"),
]

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


# 📈 Parámetros fijos
symbol = "XSP"
estrategia = "Vertical"  # 'IronCondor'

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

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

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

    # for risk in ["ultra_agresivo", "agresivo", "conservador", "intermedio"]:
    for risk in [ "intermedio","conservador"]:
        print(f"\n==================== RISK: {risk} ====================\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"):
                    dias = set([fila["Day"] for fila in data["data"] if "Day" in fila])
                    print(f"   ➜ Fechas devueltas: {sorted(dias)}")
                    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 de '{risk}' 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")
