"""
MA20 Cross Strategy - Simple but powerful (32.38% backtest)

Logic:
- Price > MA20 → LONG
- Price < MA20 → SHORT

Parameters (optimized via backtest):
- SL: 0.025%
- TP: 0.15% (ratio 6:1)
- Leverage: 250x
"""
import pandas as pd
import numpy as np
from typing import Optional
from strategies.base_strategy import BaseStrategy, TradingSignal


class MA20CrossStrategy(BaseStrategy):
    """
    MA20 Cross Strategy with optimized parameters
    """

    def __init__(self):
        super().__init__('MA20_CROSS')

        # Optimized parameters (from backtest)
        self.sl_pct = 0.00025  # 0.025% SL
        self.tp_ratio = 6.0    # 6:1 reward:risk
        self.leverage = 250
        self.risk_pct = 0.05   # 5% of capital per trade

        # Trailing stop (optional)
        self.use_trailing = False  # Can be enabled
        self.trailing_activation_pct = 0.001  # Activate after +0.1%
        self.trailing_distance_pct = 0.0005   # Trail at 0.05%

    def generate_signal(self, df: pd.DataFrame, symbol: str) -> Optional[TradingSignal]:
        """
        Generate MA20 cross signal with complete parameters
        """
        # Need at least 20 candles for MA
        if len(df) < 20:
            return None

        # Calculate MA20
        df_copy = df.copy()
        df_copy['ma_20'] = df_copy['close'].rolling(20).mean()

        if pd.isna(df_copy.iloc[-1]['ma_20']):
            return None

        current_price = df_copy.iloc[-1]['close']
        ma_20 = df_copy.iloc[-1]['ma_20']

        # Determine side
        if current_price > ma_20:
            side = 'LONG'
        elif current_price < ma_20:
            side = 'SHORT'
        else:
            return None  # No signal if price == MA

        # Calculate SL and TP
        if side == 'LONG':
            stop_loss = current_price * (1 - self.sl_pct)
            take_profit = current_price * (1 + self.sl_pct * self.tp_ratio)
        else:  # SHORT
            stop_loss = current_price * (1 + self.sl_pct)
            take_profit = current_price * (1 - self.sl_pct * self.tp_ratio)

        # Trailing stop (optional)
        trailing_activation = None
        trailing_distance = None

        if self.use_trailing:
            if side == 'LONG':
                trailing_activation = current_price * (1 + self.trailing_activation_pct)
                trailing_distance = self.trailing_distance_pct
            else:
                trailing_activation = current_price * (1 - self.trailing_activation_pct)
                trailing_distance = self.trailing_distance_pct

        # Signal score (simple: always high for MA20)
        score = 0.85

        return TradingSignal(
            symbol=symbol,
            side=side,
            entry_price=current_price,
            stop_loss=stop_loss,
            take_profit=take_profit,
            trailing_stop_activation=trailing_activation,
            trailing_stop_distance=trailing_distance,
            leverage=self.leverage,
            risk_pct=self.risk_pct,
            strategy_name=self.name,
            score=score,
            timeframe='1m',
            timestamp=df_copy.iloc[-1]['timestamp']
        )

    def get_strategy_info(self) -> dict:
        """Return strategy metadata"""
        return {
            'name': self.name,
            'description': 'MA20 Cross - Simple trend following',
            'backtest_return': 32.38,
            'win_rate': 19.2,
            'trades': 271,
            'sl_pct': self.sl_pct * 100,
            'tp_ratio': self.tp_ratio,
            'leverage': self.leverage,
            'timeframe': '1m'
        }
