# src/strategies/breakout.py
import pandas as pd

from src.strategies.base import Strategy
from src.core.strategy import Signal

class DonchianBreakout(Strategy):
    """
    Estrategia de ruptura de canales Donchian

    Señales:
    - BUY: El precio rompe el máximo de los últimos N periodos
    - SELL: El precio rompe el mínimo de los últimos N periodos
    - HOLD: En cualquier otro caso

    Parámetros:
        lookback: Ventana de cálculo del canal

    Valores por defecto:
        lookback = 20
        ≈ 1 día en timeframe 1h
        Parámetro clásico del sistema Turtle

    Notas:
        - Es una estrategia de momentum puro
        - No intenta comprar barato, compra fortaleza
        - Filtra ruido al exigir ruptura real
    """

    def __init__(self, lookback: int = 20):
        params = {
            "lookback": lookback
        }

        super().__init__(name="DonchianBreakout", params=params)

        self.lookback = lookback

    # ------------------------------------------------------------------

    def init_indicators(self, data: pd.DataFrame) -> pd.DataFrame:
        data["donchian_high"] = data["high"].rolling(self.lookback).max()
        data["donchian_low"] = data["low"].rolling(self.lookback).min()
        return data

    def generate_signal(self, idx: int) -> Signal:
        if idx < self.lookback:
            return Signal.HOLD
        
        high = self.data["high"]
        low = self.data["low"]
        close = self.data["close"]

        max_high = high.iloc[idx - self.lookback : idx].max()
        min_low = low.iloc[idx - self.lookback : idx].min()

        price = close.iloc[idx]

        if price > max_high:
            return Signal.BUY
        elif price < min_low:
            return Signal.SELL
        
        return Signal.HOLD
