import pandas as pd
from datetime import datetime, timedelta
import os

# ================================
# ⚙️ PARÁMETROS A CONFIGURAR
# ================================
folder = "/var/www/html/flask_project/chains/"
output_global = os.path.join("", "ICData1031NoResults.csv")
fecha_desde = "06/05/2025"
fecha_hasta = "06/01/2024"
horario = "10:30"
delta_call = 0.15
delta_put = -0.15
spread = 10
# ================================

def calcular_credito_mismo_iron_condor(df, delta_call_target, delta_put_target, spread, horario_str):
    df["timestamp"] = pd.to_datetime(df["timestamp"])
    horario_dado = datetime.strptime(horario_str, "%H:%M").time()
    df_filtrado = df[df["timestamp"].dt.time >= horario_dado]
    timestamps_unicos = df_filtrado["timestamp"].unique()
    if len(timestamps_unicos) == 0:
        return []

    ts_inicial = timestamps_unicos[0]
    snapshot_df = df[df["timestamp"] == ts_inicial]

    try:
        call_row = snapshot_df.iloc[(snapshot_df["delta_call"] - delta_call_target).abs().argsort()[:1]].iloc[0]
        put_row = snapshot_df.iloc[(snapshot_df["delta_put"] - delta_put_target).abs().argsort()[:1]].iloc[0]
        call_strike_sell = call_row["strike"]
        put_strike_sell = put_row["strike"]
        call_strike_buy = call_strike_sell + spread
        put_strike_buy = put_strike_sell - spread
    except:
        print("❌ Error seleccionando strikes.")
        return []

    resultados = [[fecha_actual.strftime("%m/%d/%Y"), "", ""]]
    for ts in timestamps_unicos:
        snap = df[df["timestamp"] == ts]
        try:
            call_sell_mid = snap[snap["strike"] == call_strike_sell][["bid_call", "ask_call"]].mean(axis=1).values[0]
            call_buy_mid  = snap[snap["strike"] == call_strike_buy][["bid_call", "ask_call"]].mean(axis=1).values[0]
            put_sell_mid  = snap[snap["strike"] == put_strike_sell][["bid_put", "ask_put"]].mean(axis=1).values[0]
            put_buy_mid   = snap[snap["strike"] == put_strike_buy][["bid_put", "ask_put"]].mean(axis=1).values[0]
            underlying_price = snap["underlying_price"].iloc[0]
            credito = (call_sell_mid + put_sell_mid - call_buy_mid - put_buy_mid) * 100

            resultados.append([
                ts.strftime("%H:%M:%S"),
                round(credito, 2),
                round(underlying_price, 2)
            ])
        except:
            continue
    return resultados

# ================================
# 🚀 Ejecutar y escribir horizontal
# ================================
fecha_inicio = datetime.strptime(fecha_desde, "%m/%d/%Y")
fecha_fin = datetime.strptime(fecha_hasta, "%m/%d/%Y")
fecha_actual = fecha_inicio

columnas_por_dia = []

while fecha_actual >= fecha_fin:
    fecha_str_csv = fecha_actual.strftime("%Y-%m-%d")
    parquet_path = os.path.join(folder, f"optionChain_$SPX_{fecha_str_csv}.parquet")
    csv_path     = os.path.join(folder, f"optionChain_$SPX_{fecha_str_csv}.csv")

    if os.path.exists(parquet_path) or os.path.exists(csv_path):
        print(f"📅 Procesando: {fecha_str_csv}")
        try:
            if os.path.exists(parquet_path):
                df = pd.read_parquet(parquet_path)
                print("📦 Cargando desde .parquet")
            else:
                df = pd.read_csv(csv_path)
                print("📄 Cargando desde .csv")

            resultado = calcular_credito_mismo_iron_condor(df, delta_call, delta_put, spread, horario)
            if resultado:
                columnas_por_dia.append(resultado)
                print("✅ Resultados agregados.")
            else:
                print("⚠️ Sin resultados.")
        except Exception as e:
            print(f"❌ Error procesando {fecha_str_csv}: {e}")
    else:
        print(f"⛔ No existe ni .parquet ni .csv para: {fecha_str_csv}")
    fecha_actual -= timedelta(days=1)

# Alineación horizontal
max_filas = max(len(col) for col in columnas_por_dia)
for i in range(len(columnas_por_dia)):
    while len(columnas_por_dia[i]) < max_filas:
        columnas_por_dia[i].append(["", "", ""])

final_data = []
for row_idx in range(max_filas):
    fila = []
    for bloque in columnas_por_dia:
        fila.extend(bloque[row_idx])
        fila.append("")  # separación entre bloques
    final_data.append(fila)

pd.DataFrame(final_data).to_csv(output_global, index=False, header=False)
print(f"\n🟢 Archivo final guardado correctamente: {output_global}")
