//! Configuration for production safety features

use std::time::Duration;

/// Configuration for Kubernetes operations with production safety features
#[derive(Debug, Clone)]
pub struct KubernetesConfig {
    /// Timeout for individual API operations
    pub operation_timeout: Duration,
    
    /// Maximum number of retry attempts for failed operations
    pub max_retries: u32,
    
    /// Base delay for exponential backoff retry strategy
    pub retry_base_delay: Duration,
    
    /// Maximum delay between retries
    pub retry_max_delay: Duration,
    
    /// Rate limiting: maximum requests per second
    pub rate_limit_rps: u32,
    
    /// Rate limiting: burst capacity
    pub rate_limit_burst: u32,
}

impl Default for KubernetesConfig {
    fn default() -> Self {
        Self {
            // Conservative timeout for production
            operation_timeout: Duration::from_secs(30),
            
            // Reasonable retry attempts
            max_retries: 3,
            
            // Exponential backoff starting at 1 second
            retry_base_delay: Duration::from_secs(1),
            
            // Maximum 30 seconds between retries
            retry_max_delay: Duration::from_secs(30),
            
            // Conservative rate limiting: 10 requests per second
            rate_limit_rps: 10,
            
            // Allow small bursts
            rate_limit_burst: 20,
        }
    }
}

impl KubernetesConfig {
    /// Create a new configuration with custom settings
    pub fn new() -> Self {
        Self::default()
    }
    
    /// Set operation timeout
    pub fn with_timeout(mut self, timeout: Duration) -> Self {
        self.operation_timeout = timeout;
        self
    }
    
    /// Set retry configuration
    pub fn with_retries(mut self, max_retries: u32, base_delay: Duration, max_delay: Duration) -> Self {
        self.max_retries = max_retries;
        self.retry_base_delay = base_delay;
        self.retry_max_delay = max_delay;
        self
    }
    
    /// Set rate limiting configuration
    pub fn with_rate_limit(mut self, rps: u32, burst: u32) -> Self {
        self.rate_limit_rps = rps;
        self.rate_limit_burst = burst;
        self
    }
    
    /// Create configuration optimized for high-throughput environments
    pub fn high_throughput() -> Self {
        Self {
            operation_timeout: Duration::from_secs(60),
            max_retries: 5,
            retry_base_delay: Duration::from_millis(500),
            retry_max_delay: Duration::from_secs(60),
            rate_limit_rps: 50,
            rate_limit_burst: 100,
        }
    }
    
    /// Create configuration optimized for low-latency environments
    pub fn low_latency() -> Self {
        Self {
            operation_timeout: Duration::from_secs(10),
            max_retries: 2,
            retry_base_delay: Duration::from_millis(100),
            retry_max_delay: Duration::from_secs(5),
            rate_limit_rps: 20,
            rate_limit_burst: 40,
        }
    }
    
    /// Create configuration for development/testing
    pub fn development() -> Self {
        Self {
            operation_timeout: Duration::from_secs(120),
            max_retries: 1,
            retry_base_delay: Duration::from_millis(100),
            retry_max_delay: Duration::from_secs(2),
            rate_limit_rps: 100,
            rate_limit_burst: 200,
        }
    }
}
