# src/strategies/rsi_strategy.py
"""
Estrategia basada en RSI
"""
import pandas as pd
from ..core.strategy import Strategy, Signal, calculate_rsi

class RSIStrategy(Strategy):
    """
    Estrategia basada en RSI (Relative Strength Index)
    
    Señales:
    - BUY: Cuando RSI < oversold (mercado sobrevendido)
    - SELL: Cuando RSI > overbought (mercado sobrecomprado)
    - HOLD: RSI en zona neutral
    
    Parámetros:
        rsi_period: Periodo del RSI (default: 14)
        oversold: Umbral de sobreventa (default: 30)
        overbought: Umbral de sobrecompra (default: 70)
    """
    
    strategy_id = "rsi"
    
    def __init__(self, rsi_period: int = 14, oversold: float = 30, overbought: float = 70):
        
        params = {
            'rsi_period': rsi_period,
            'oversold': oversold,
            'overbought': overbought
        }
        
        super().__init__(name="RSI Strategy", params=params)
        
        self.rsi_period = rsi_period
        self.oversold = oversold
        self.overbought = overbought

    @classmethod
    def parameters_schema(cls) -> dict:
        return {
            "rsi_period": {
                "type": "int",
                "min": 1,
                "max": 200,
                "default": 14,
            },
            "oversold": {
                "type": "float",
                "min": 0,
                "max": 100,
                "default": 30,
            },
            "overbought": {
                "type": "float",
                "min": 0,
                "max": 100,
                "default": 70,
            },
        }


    def init_indicators(self, data: pd.DataFrame) -> pd.DataFrame:
        """
        Calcula el RSI
        """
        data['rsi'] = calculate_rsi(data['close'], self.rsi_period)
        return data
    
    def generate_signal(self, idx: int) -> Signal:
        """
        Genera señal basada en niveles de RSI
        """
        if self.data is None:
            raise ValueError("Data no establecida")
        
        rsi = self.data.iloc[idx]['rsi']
        
        # Verificar que RSI está calculado
        if pd.isna(rsi):
            return Signal.HOLD
        
        # Sobreventa: señal de compra
        if rsi < self.oversold and self.current_position <= 0:
            return Signal.BUY
        
        # Sobrecompra: señal de venta
        elif rsi > self.overbought and self.current_position >= 0:
            return Signal.SELL
        
        return Signal.HOLD