//! Minimal Feature Configuration for ML Strategy
//!
//! This module defines a minimal FeatureConfig type that can be used in common
//! without creating a circular dependency with the ml crate.
//!
//! The ml crate has a more comprehensive FeatureConfig with additional methods,
//! but this version provides just enough functionality for common/ml_strategy.rs.

use serde::{Deserialize, Serialize};

/// Feature engineering phase (Wave 19 progressive implementation)
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum FeaturePhase {
    /// Wave A: 26 features (baseline technical indicators + microstructure)
    WaveA,
    /// Wave B: 36 features (adds alternative bars + barrier optimization)
    WaveB,
    /// Wave C: 201 features (adds fractional diff + regime detection)
    WaveC,
    /// Wave D: 225 features (adds Wave D regime detection + adaptive strategies)
    WaveD,
}

/// Minimal Feature Configuration
///
/// This is a simplified version of ml::features::config::FeatureConfig
/// that can be used in common without creating circular dependencies.
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FeatureConfig {
    /// Feature engineering phase (Wave A/B/C/D)
    pub phase: FeaturePhase,
    
    /// Enable baseline OHLCV features (5 features)
    pub enable_ohlcv: bool,
    
    /// Enable technical indicators (21 features)
    pub enable_technical_indicators: bool,
    
    /// Enable microstructure features (3 features)
    pub enable_microstructure: bool,
    
    /// Enable alternative bar features (10 features)
    pub enable_alternative_bars: bool,
    
    /// Enable barrier optimization features
    pub enable_barrier_optimization: bool,
    
    /// Enable fractional differentiation features (162 features)
    pub enable_fractional_diff: bool,
    
    /// Enable regime detection features
    pub enable_regime_detection: bool,
    
    /// Enable Wave D regime detection features (24 features)
    pub enable_wave_d_regime: bool,
}

impl Default for FeatureConfig {
    fn default() -> Self {
        Self::wave_a()
    }
}

impl FeatureConfig {
    /// Wave A configuration: 26 features (baseline)
    pub fn wave_a() -> Self {
        Self {
            phase: FeaturePhase::WaveA,
            enable_ohlcv: true,
            enable_technical_indicators: true,
            enable_microstructure: false,
            enable_alternative_bars: false,
            enable_barrier_optimization: false,
            enable_fractional_diff: false,
            enable_regime_detection: false,
            enable_wave_d_regime: false,
        }
    }

    /// Wave B configuration: 36 features (alternative bars)
    pub fn wave_b() -> Self {
        Self {
            phase: FeaturePhase::WaveB,
            enable_ohlcv: true,
            enable_technical_indicators: true,
            enable_microstructure: false,
            enable_alternative_bars: true,
            enable_barrier_optimization: true,
            enable_fractional_diff: false,
            enable_regime_detection: false,
            enable_wave_d_regime: false,
        }
    }

    /// Wave C configuration: 201 features (advanced)
    pub fn wave_c() -> Self {
        Self {
            phase: FeaturePhase::WaveC,
            enable_ohlcv: true,
            enable_technical_indicators: true,
            enable_microstructure: true,
            enable_alternative_bars: true,
            enable_barrier_optimization: true,
            enable_fractional_diff: true,
            enable_regime_detection: true,
            enable_wave_d_regime: false,
        }
    }

    /// Wave D configuration: 225 features (regime detection + adaptive strategies)
    pub fn wave_d() -> Self {
        Self {
            phase: FeaturePhase::WaveD,
            enable_ohlcv: true,
            enable_technical_indicators: true,
            enable_microstructure: true,
            enable_alternative_bars: true,
            enable_barrier_optimization: true,
            enable_fractional_diff: true,
            enable_regime_detection: true,
            enable_wave_d_regime: true,
        }
    }

    /// Calculate total feature count based on enabled feature groups
    pub fn feature_count(&self) -> usize {
        let mut count = 0;

        if self.enable_ohlcv {
            count += 5;
        }

        if self.enable_technical_indicators {
            count += 21;
        }

        if self.enable_microstructure {
            count += 3;
        }

        if self.enable_alternative_bars {
            count += 10;
        }

        if self.enable_fractional_diff {
            count += 162;
        }

        if self.enable_wave_d_regime {
            count += 24;
        }

        count
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_wave_a_config() {
        let config = FeatureConfig::wave_a();
        assert_eq!(config.phase, FeaturePhase::WaveA);
        assert_eq!(config.feature_count(), 26);
    }

    #[test]
    fn test_wave_b_config() {
        let config = FeatureConfig::wave_b();
        assert_eq!(config.phase, FeaturePhase::WaveB);
        assert_eq!(config.feature_count(), 36);
    }

    #[test]
    fn test_wave_c_config() {
        let config = FeatureConfig::wave_c();
        assert_eq!(config.phase, FeaturePhase::WaveC);
        assert_eq!(config.feature_count(), 201);
    }

    #[test]
    fn test_wave_d_config() {
        let config = FeatureConfig::wave_d();
        assert_eq!(config.phase, FeaturePhase::WaveD);
        assert_eq!(config.feature_count(), 225);
    }

    #[test]
    fn test_default_is_wave_a() {
        let config = FeatureConfig::default();
        assert_eq!(config.phase, FeaturePhase::WaveA);
        assert_eq!(config.feature_count(), 26);
    }
}
