from freqtrade.strategy.interface import IStrategy
from pandas import DataFrame
import talib.abstract as ta
import joblib
import os

class HermesAI(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '1m'

    # Configuración de ROI y gestión de riesgo para ventas
    minimal_roi = {
        "0": 0.015,
        "10": 0.007,
        "30": 0
    }

    stoploss = -0.05
    trailing_stop = True
    trailing_stop_positive = 0.008
    trailing_stop_positive_offset = 0.012
    trailing_only_offset_is_reached = True

    startup_candle_count = 50

    def __init__(self, config):
        super().__init__(config)
        model_path = 'user_data/ml_models/hermes_model_buy.pkl'
        self.model_buy = joblib.load(model_path) if os.path.exists(model_path) else None

    def populate_indicators(self, df: DataFrame, metadata: dict) -> DataFrame:
        df['ema_21'] = ta.EMA(df, timeperiod=21)
        df['ema_50'] = ta.EMA(df, timeperiod=50)

        macd = ta.MACD(df)
        df['macd'] = macd['macd']
        df['macdsignal'] = macd['macdsignal']

        df['atr'] = ta.ATR(df, timeperiod=14)
        df['volume'] = df['volume']

        bbands = ta.BBANDS(df, timeperiod=20)
        df['bb_upperband'] = bbands['upperband']
        df['bb_lowerband'] = bbands['lowerband']

        df['price_above_ema21'] = df['close'] / df['ema_21']
        df['price_above_bb_upper'] = df['close'] / df['bb_upperband']

        return df

    def _prepare_features(self, df: DataFrame) -> DataFrame:
        features = [
            'ema_21', 'ema_50',
            'macd', 'macdsignal',
            'atr', 'volume',
            'bb_upperband', 'bb_lowerband',
            'price_above_ema21', 'price_above_bb_upper'
        ]
        return df.dropna(subset=features)[features]

    def populate_buy_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        df['buy'] = 0
        if self.model_buy is None:
            return df

        try:
            valid = df.dropna(subset=[
                'ema_21', 'ema_50',
                'macd', 'macdsignal',
                'atr', 'volume',
                'bb_upperband', 'bb_lowerband',
                'price_above_ema21', 'price_above_bb_upper'
            ])
            X = self._prepare_features(valid)
            preds = self.model_buy.predict(X)
            df.loc[valid.index, 'buy'] = preds
        except Exception as e:
            print(f"[HermesAI] Error en predicción de compra: {e}")

        return df

    def populate_sell_trend(self, df: DataFrame, metadata: dict) -> DataFrame:
        # No usamos ML para venta; se vende por ROI / trailing / stoploss
        df['sell'] = 0
        return df