import pandas as pd
import numpy as np
import ta
import argparse
import os
import tensorflow as tf

# === Argumentos ===
parser = argparse.ArgumentParser()
parser.add_argument("--pair", required=True, help="Par en formato WCT/USDC")
parser.add_argument("--date", required=False, help="Fecha exacta de la vela (YYYY-MM-DD HH:MM:SS)")
args = parser.parse_args()

pair_filename = args.pair.replace("/", "_")
model_path = f"modelo_lstm_is_local_min_{pair_filename}.h5"
data_path = f"/root/freqtrade/user_data/data/binance/{pair_filename}-1m.feather"

# === Validaciones
if not os.path.isfile(model_path):
    raise FileNotFoundError(f"Modelo LSTM no encontrado: {model_path}")
if not os.path.isfile(data_path):
    raise FileNotFoundError(f"Archivo de datos no encontrado: {data_path}")

# === Cargar modelo y datos
model = tf.keras.models.load_model(model_path)
df = pd.read_feather(data_path).sort_values("date").reset_index(drop=True)

# === Indicadores
df["rsi"] = ta.momentum.RSIIndicator(df["close"], window=14).rsi()
df["ema_10"] = ta.trend.EMAIndicator(df["close"], window=10).ema_indicator()
macd = ta.trend.MACD(df["close"])
df["macd"] = macd.macd()
df["macd_diff"] = macd.macd_diff()
df["price_change"] = df["close"].pct_change()
df["volume_change"] = df["volume"].pct_change()
df["rsi_change"] = df["rsi"].diff()
df["ema_diff"] = df["close"] - df["ema_10"]
df["macd_signal"] = macd.macd_signal()

df.dropna(inplace=True)
df.reset_index(drop=True, inplace=True)

features = [
    "open", "high", "low", "close", "volume",
    "rsi", "ema_10", "macd", "macd_diff", "macd_signal",
    "price_change", "volume_change", "ema_diff", "rsi_change"
]

SEQ_LEN = 20
HORIZON = 6

# === Función para extraer secuencia LSTM en un punto dado
def get_sequence_at_index(df, idx):
    if idx < SEQ_LEN:
        raise ValueError("No hay suficiente historial para formar una secuencia LSTM")
    data_seq = df[features].iloc[idx - SEQ_LEN:idx].values.astype(np.float32)
    return np.expand_dims(data_seq, axis=0)  # shape: (1, SEQ_LEN, num_features)

if args.date is None:
    print(f"\n🔁 Escaneando todo {args.pair} con LSTM...")
    encontrados = []
    for idx in range(SEQ_LEN, len(df) - HORIZON):
        try:
            seq = get_sequence_at_index(df, idx)
            pred = model.predict(seq, verbose=0)[0][0]
            if pred > 0.5:
                row = df.iloc[idx]
                future_rsis = df["rsi"].iloc[idx+1:idx+1+HORIZON]
                real_min = row["rsi"] < future_rsis.min()
                encontrados.append({
                    "fecha": row["date"],
                    "proba": round(pred * 100, 2),
                    "real_min": real_min
                })
        except Exception as e:
            continue

    print(f"\n🔎 {len(encontrados)} señales encontradas.")
    for e in encontrados[-10:]:  # Mostrar últimas 10
        print(f"{e['fecha']} → Prob: {e['proba']}% | Real: {'✅' if e['real_min'] else '❌'}")

else:
    # Buscar fecha exacta
    date = pd.to_datetime(args.date)
    if date.tzinfo is None:
        date = date.tz_localize("UTC")
    date = date.floor("min")
    df["date"] = df["date"].dt.floor("min")

    row_idx = df[df["date"] == date].index
    if row_idx.empty:
        diffs = abs(df["date"] - date)
        idx = diffs.idxmin()
        print(f"❌ No se encontró la fecha exacta. ¿Querías decir?: {df.loc[idx, 'date']}")
    else:
        idx = row_idx[0]
        print(f"✅ Fecha encontrada en idx={idx}, {df.loc[idx, 'date']}")

    try:
        seq = get_sequence_at_index(df, idx)
        pred = model.predict(seq, verbose=0)[0][0]
    except ValueError as e:
        print(f"❌ No hay suficiente historial para generar secuencia en esa fecha.")
        exit()

    row = df.loc[idx]
    real_min = False
    if idx + HORIZON < len(df):
        future_rsis = df["rsi"].iloc[idx+1:idx+1+HORIZON]
        real_min = row["rsi"] < future_rsis.min()

    print(f"\n📊 Par: {args.pair}")
    print(f"📅 Fecha: {row['date']}")
    print(f"🔍 ¿Es mínimo local según el modelo?: {'✅ SÍ' if pred > 0.5 else '❌ NO'}")
    print(f"📈 Probabilidad: {pred:.2%}")
    print(f"📉 ¿Fue realmente un mínimo frente a las siguientes {HORIZON} velas?: {'✅ SÍ' if real_min else '❌ NO'}")
