# pragma pylint: disable=missing-docstring, invalid-name, pointless-string-statement
"""
Hyperopt configuration for SimpleStrategy
"""
from freqtrade.optimize.hyperopt_interface import IHyperOpt
from freqtrade.constants import Config
from pandas import DataFrame
from typing import Dict, List, Any

# Import parameter types
from freqtrade.optimize.hyperopt_interface import (
    CategoricalParameter,
    DecimalParameter,
    IntParameter,
)


class SimpleHyperopt(IHyperOpt):
    """
    Hyperopt class for optimizing SimpleStrategy parameters
    """
    
    def indicator_space(self) -> Dict[str, Any]:
        """
        Define the search space for indicators
        """
        return {
            'buy_rsi': IntParameter(15, 40, default=25),
            'sell_rsi': IntParameter(60, 85, default=75),
            'stoploss': DecimalParameter(-0.02, -0.08, 0.01, default=-0.05),
        }
    
    def roi_space(self) -> Dict[str, Any]:
        """
        Define the search space for ROI (Return on Investment)
        """
        return {
            'roi_t1': IntParameter(10, 60, 5, default=30),
            'roi_t2': IntParameter(10, 60, 5, default=30),
            'roi_t3': IntParameter(5, 30, 5, default=15),
            'roi_p1': DecimalParameter(0.01, 0.05, 0.01, default=0.02),
            'roi_p2': DecimalParameter(0.01, 0.04, 0.01, default=0.02),
            'roi_p3': DecimalParameter(0.01, 0.03, 0.01, default=0.02),
        }
    
    def generate_roi_table(self, params: Dict[str, Any]) -> Dict[int, float]:
        """
        Generate ROI table from hyperopt parameters
        """
        roi_t1 = params['roi_t1']
        roi_t2 = params['roi_t2']
        roi_t3 = params['roi_t3']
        roi_p1 = params['roi_p1']
        roi_p2 = params['roi_p2']
        roi_p3 = params['roi_p3']
        
        # Build ROI table (time in minutes -> profit %)
        roi_table = {
            roi_t1 + roi_t2 + roi_t3: roi_p3,
            roi_t2 + roi_t3: roi_p2,
            roi_t3: roi_p1,
            0: roi_p1 + roi_p2 + roi_p3
        }
        
        return roi_table
    
    def generate_strategy(self, config: Config, params: Dict[str, Any]) -> Any:
        """
        Generate strategy with optimized parameters
        """
        from freqtrade.resolvers import StrategyResolver
        
        # Load the strategy
        strategy = StrategyResolver.load_strategy(config)
        
        # Override parameters
        strategy.buy_rsi = params['buy_rsi']
        strategy.sell_rsi = params['sell_rsi']
        strategy.stoploss = params['stoploss']
        strategy.minimal_roi = self.generate_roi_table(params)
        
        return strategy