# tasks_backtestingidea.py
from celery_app import celery_app
from backtestingIdea import (
    calcular_precios_verticales,
    calcular_precios_iron_condor,
    PATH_UBUNTU_CHAINS
)
import pandas as pd
import os

@celery_app.task(bind=True, queue="backtesting_idea2")
def run_backtesting_idea(
    self,
    symbol,
    estrategia,
    timeHour,
    risk,
    desde,
    hasta,
):
    """
    Task Celery que ejecuta el backtesting pesado.
    NO toca la lógica original.
    """

    # Mapeo de desplazamientos (copiado 1:1 de tu endpoint)
    if symbol in ["SPX", "RUT"]:
        desplazamientos = {
            'conservador': 0,
            'intermedio': -5,
            'agresivo': -10,
            'ultra_agresivo': -15
        }
    else:
        desplazamientos = {
            'conservador': 0,
            'intermedio': -1,
            'agresivo': -2,
            'ultra_agresivo': -3
        }

    desplazamiento = desplazamientos[risk]

    archivo = f"/var/www/html/backtestingmarket/predictor_data/makekos/{symbol}/{symbol}_{estrategia}_strikes_{timeHour}.csv"
    if not os.path.exists(archivo):
        raise FileNotFoundError(f"Archivo de strikes no encontrado: {archivo}")

    df_strikes = pd.read_csv(archivo)

    if estrategia.upper() == "VERTICAL":
        df_result, total, wins, losses = calcular_precios_verticales(
            df_strikes,
            PATH_UBUNTU_CHAINS,
            desplazamiento,
            desde,
            hasta
        )

    elif estrategia.upper() == "IRONCONDOR":
        df_result, total, wins, losses = calcular_precios_iron_condor(
            df_strikes,
            PATH_UBUNTU_CHAINS,
            desplazamiento,
            desde,
            hasta
        )
    else:
        raise ValueError("Estrategia no reconocida")

    # ⬅️ devolvemos EXACTAMENTE lo que hoy devuelves en Flask
    return {
        "data": df_result.astype(object).to_dict(orient="records"),
        "profit_total": float(round(total, 2)),
        "wins": int(wins),
        "losses": int(losses)
    }
