from freqtrade.strategy import IStrategy
import talib.abstract as ta
import redis

class OrderFlowStrategy(IStrategy):
    INTERFACE_VERSION = 3
    timeframe = '1m'
    
    minimal_roi = {
        "0": 1 
    }

    def __init__(self, config: dict) -> None:
        super().__init__(config)
        self.r = redis.Redis(host='localhost', port=6379, db=0)

    def populate_indicators(self, dataframe, metadata):
        print("🔍 populate_indicators ejecutado para", metadata['pair'])
        dataframe['rsi'] = ta.RSI(dataframe, timeperiod=14)
        macd, macdsignal, macdhist = ta.MACD(dataframe["close"])
        dataframe['macd'] = macd
        dataframe['macdsignal'] = macdsignal
        dataframe['macdhist'] = macdhist
        return dataframe

    def populate_entry_trend(self, dataframe, metadata):
        print("🔍 populate_entry_trend ejecutado para", metadata['pair'])
        dataframe['enter_long'] = 0
        dataframe['enter_short'] = 0

        try:
            signal = self.r.get("orderflow_signal")
            if signal:
                signal = signal.decode("utf-8")
                print(f"📥 Señal desde Redis (entry): {signal}")

                if signal == "buy":
                    dataframe.loc[
                        # dataframe['rsi'] <= 40,
                        (dataframe['macd'] < 0) &
                        (dataframe['macd'] >= dataframe['macd'].shift(1)),
                        'enter_long'
                    ] = 1
                    print("✅ Señal de entrada LONG activada")
                elif signal == "sell":
                    dataframe.loc[:, 'enter_short'] = 1
                    print("✅ Señal de entrada SHORT activada")
                else:
                    print("🔸 Señal neutral, sin entrada")
            else:
                print("⚠️ No se recibió ninguna señal desde Redis (entry)")

        except Exception as e:
            print(f"❌ Redis error en populate_entry_trend: {e}")

        return dataframe

    def populate_exit_trend(self, dataframe, metadata):
        print("🔍 populate_exit_trend ejecutado para", metadata['pair'])
        dataframe['exit_long'] = 0
        dataframe['exit_short'] = 0

        # try:
        #     signal = self.r.get("orderflow_signal")
        #     if signal:
        #         signal = signal.decode("utf-8")
        #         print(f"📥 Señal desde Redis (exit): {signal}")

        #         if signal == "buy":
        #             dataframe.loc[:, 'exit_short'] = 1
        #             print("🚪 Señal de salida SHORT activada")
        #         elif signal == "sell":
        #             dataframe.loc[:, 'exit_long'] = 1
        #             print("🚪 Señal de salida LONG activada")
        #         else:
        #             print("🔸 Señal neutral, sin salida")
        #     else:
        #         print("⚠️ No se recibió ninguna señal desde Redis (exit)")

        # except Exception as e:
        #     print(f"❌ Redis error en populate_exit_trend: {e}")

        return dataframe
