package otel

import "time"

// Config OTel配置结构 - 极简版
type Config struct {
	ServiceName  string
	CollectorURL string
	Insecure     bool
	Compressor   string
	Headers      map[string]string
	SampleRate   float64
	// 重试和超时配置
	Timeout           time.Duration // 连接超时时间
	RetryEnabled      bool          // 是否启用重试
	RetryInitInterval time.Duration // 初始重试间隔
	RetryMaxInterval  time.Duration // 最大重试间隔
	RetryMaxElapsed   time.Duration // 最大重试总时间
}

// DefaultConfig 返回默认配置
func DefaultConfig() *Config {
	return &Config{
		Insecure:          false,            // 默认使用安全连接
		Compressor:        "gzip",           // 默认gzip压缩
		SampleRate:        1.0,              // 默认全采样
		Timeout:           10 * time.Second, // 默认连接超时10秒
		RetryEnabled:      true,             // 默认启用重试
		RetryInitInterval: 1 * time.Second,  // 初始重试延迟1秒
		RetryMaxInterval:  30 * time.Second, // 最大重试延迟30秒
		RetryMaxElapsed:   5 * time.Minute,  // 最多重试5分钟
	}
}

// Validate 验证配置有效性
func (c *Config) Validate() error {
	if c.ServiceName == "" {
		return ErrInvalidConfig("service name cannot be empty")
	}
	if c.CollectorURL == "" {
		return ErrInvalidConfig("collector URL cannot be empty")
	}
	if c.SampleRate < 0 || c.SampleRate > 1 {
		return ErrInvalidConfig("sample rate must be between 0 and 1")
	}
	return nil
}

// Clone 克隆配置
func (c *Config) Clone() *Config {
	clone := *c

	// 深拷贝headers
	if c.Headers != nil {
		clone.Headers = make(map[string]string)
		for k, v := range c.Headers {
			clone.Headers[k] = v
		}
	}

	return &clone
}

// ValidateAndSetDefaults 验证并设置默认值
func (c *Config) ValidateAndSetDefaults() error {
	if err := c.Validate(); err != nil {
		return err
	}

	// 设置缺失的超时和重试参数为默认值
	if c.Timeout == 0 {
		c.Timeout = 10 * time.Second
	}
	if c.RetryInitInterval == 0 {
		c.RetryInitInterval = 1 * time.Second
	}
	if c.RetryMaxInterval == 0 {
		c.RetryMaxInterval = 30 * time.Second
	}
	if c.RetryMaxElapsed == 0 {
		c.RetryMaxElapsed = 5 * time.Minute
	}

	return nil
}
