# top_horarios_multi.py
from flask import Blueprint, jsonify, current_app
from pathlib import Path
import pandas as pd
import re

bp = Blueprint("top_horarios_multi", __name__)

DATA_DIR = Path("/var/www/html/backtestingmarket/top_horarios")  # ajusta si tus CSVs viven en otro lado

ALLOWED_SYMBOLS = {"SPX", "RUT", "XSP"}
RISK_ORDER = ["cons", "inte", "agre", "ultr"]

FILENAME_RE = re.compile(
    r"^resultados_backtesting_"
    r"(?P<risk>cons|inte|agre|ultr)_"
    r"(?P<sym>SPX|RUT|XSP)_"
    r"(?P<from>\d{4}-\d{2}-\d{2})_"
    r"(?P<to>\d{4}-\d{2}-\d{2})"
    r"_Vertical\.csv$"
)

def hhmm_to_str(hhmm):
    hh = int(hhmm) // 100
    mm = int(hhmm) % 100
    return f"{hh:02d}:{mm:02d}"

@bp.route("/api/top-vertical", methods=["GET"])
def api_top_vertical():
    """
    Respuesta:
    {
      ok: true,
      symbols: ["SPX","RUT","XSP"],
      from_to: { "SPX": {"from":"YYYY-MM-DD","to":"YYYY-MM-DD"}, ... },
      data: {
        "SPX": { "cons":[{hora,profit}, x3], "inte":[...], "agre":[...], "ultr":[...] },
        "RUT": { ... },
        "XSP": { ... }
      }
    }
    """
    try:
        # Escanear carpeta y agrupar por símbolo -> riesgo -> path
        sym_to_risk_paths = {}   # { "SPX": { "cons": Path, ... }, ... }
        sym_from_to = {}         # { "SPX": ("from","to"), ... }

        for p in DATA_DIR.iterdir():
            if not p.is_file():
                continue
            m = FILENAME_RE.match(p.name)
            if not m:
                continue
            sym = m.group("sym")
            if sym not in ALLOWED_SYMBOLS:
                continue
            risk = m.group("risk")
            f_date, t_date = m.group("from"), m.group("to")

            sym_to_risk_paths.setdefault(sym, {})[risk] = p
            # La primera pareja detectada por símbolo nos sirve (en tus datos siempre coinciden)
            sym_from_to.setdefault(sym, (f_date, t_date))

        if not sym_to_risk_paths:
            return jsonify({"ok": False, "error": "No se encontraron CSVs válidos."}), 404

        # Construir respuesta
        out_data = {}
        for sym, risk_paths in sym_to_risk_paths.items():
            out_data[sym] = {}
            for rk in RISK_ORDER:
                rows = []
                path = risk_paths.get(rk)
                if not path:
                    out_data[sym][rk] = rows
                    continue
                try:
                    df = pd.read_csv(path)
                    if not {"hora", "profit"}.issubset(df.columns):
                        return jsonify({"ok": False, "error": f"{path.name} requiere columnas 'hora' y 'profit'"}), 400
                    top3 = df.sort_values("profit", ascending=False).head(3)
                    rows = [{"hora": hhmm_to_str(r["hora"]), "profit": float(r["profit"])} for _, r in top3.iterrows()]
                    out_data[sym][rk] = rows
                except Exception as e:
                    current_app.logger.exception(e)
                    out_data[sym][rk] = []

        # Armar from/to por símbolo
        from_to = {sym: {"from": f, "to": t} for sym, (f, t) in sym_from_to.items()}

        return jsonify({
            "ok": True,
            "symbols": sorted(out_data.keys(), key=lambda s: ["SPX","RUT","XSP"].index(s) if s in ["SPX","RUT","XSP"] else 999),
            "from_to": from_to,
            "data": out_data
        })
    except Exception as e:
        current_app.logger.exception(e)
        return jsonify({"ok": False, "error": str(e)}), 500
