package config

import (
	"fmt"
	"os"
	"sync"
	"time"
)

// Config 应用配置（持久化在 MySQL monitor_kv，首次启动前由环境变量提供默认值；MySQL 连接信息首次连接仍依赖环境变量/DB_DSN）
type Config struct {
	Server   ServerConfig   `json:"server"`
	Monitor  MonitorConfig  `json:"monitor"`
	DataPath string         `json:"data_path"`
	Database DatabaseConfig `json:"database"`
}

// ServerConfig 服务器配置
type ServerConfig struct {
	Port string `json:"port"`
	Host string `json:"host"`
}

// MonitorConfig 监控配置
type MonitorConfig struct {
	Interval    time.Duration `json:"interval"`     // 检测间隔
	Timeout     time.Duration `json:"timeout"`      // 请求超时时间
	RetryCount  int           `json:"retry_count"`  // 重试次数
	HistoryDays int           `json:"history_days"` // 保留历史天数
}

var (
	cfg  *Config
	once sync.Once
)

// GetConfig 获取配置单例（连接 MySQL 后由 storage 根据 monitor_kv 覆盖）
func GetConfig() *Config {
	once.Do(func() {
		cfg = &Config{
			Server: ServerConfig{
				Port: getEnv("SERVER_PORT", "8080"),
				Host: getEnv("SERVER_HOST", "0.0.0.0"),
			},
			Monitor: MonitorConfig{
				Interval:    parseDuration(getEnv("MONITOR_INTERVAL", "30m"), 30*time.Minute),
				Timeout:     parseDuration(getEnv("MONITOR_TIMEOUT", "10s"), 10*time.Second),
				RetryCount:  parseInt(getEnv("MONITOR_RETRY_COUNT", "3"), 3),
				HistoryDays: parseInt(getEnv("MONITOR_HISTORY_DAYS", "90"), 90),
			},
			DataPath: getEnv("DATA_PATH", "./data"),
			Database: DatabaseConfig{
				Host:     getEnv("DB_HOST", "192.168.1.100"),
				Port:     getEnv("DB_PORT", "3306"),
				User:     getEnv("DB_USER", "mengyaping"),
				Password: getEnv("DB_PASSWORD", "mengyaping"),
				Database: getEnv("DB_NAME", "mengyaping"),
			},
		}
	})
	return cfg
}

// getEnv 获取环境变量，如果不存在则返回默认值
func getEnv(key, defaultValue string) string {
	if value := os.Getenv(key); value != "" {
		return value
	}
	return defaultValue
}

// parseInt 解析整数环境变量
func parseInt(value string, defaultValue int) int {
	if value == "" {
		return defaultValue
	}
	var result int
	if _, err := fmt.Sscanf(value, "%d", &result); err != nil {
		return defaultValue
	}
	return result
}

// parseDuration 解析时间间隔环境变量
func parseDuration(value string, defaultValue time.Duration) time.Duration {
	if value == "" {
		return defaultValue
	}
	if duration, err := time.ParseDuration(value); err == nil {
		return duration
	}
	return defaultValue
}
