// Package config 提供配置文件读取和解析功能
// 支持YAML格式的配置文件解析
// 包含服务器和数据库相关配置
package config

import (
	"fmt"
	"os"

	"gopkg.in/yaml.v2"
)

// Config 代表应用的完整配置结构
type Config struct {
	// Server 服务器配置
	Server ServerConfig `yaml:"server"`

	// Database 数据库配置
	Database DatabaseConfig `yaml:"database"`

	// WebSocket WebSocket配置
	WebSocket WebSocketConfig `yaml:"websocket"`

	// Heartbeat 心跳配置
	Heartbeat HeartbeatConfig `yaml:"heartbeat"`
}

// ServerConfig 代表服务器配置
type ServerConfig struct {
	// Host 服务器监听IP
	Host string `yaml:"host"`

	// Port 服务器监听端口
	Port int `yaml:"port"`

	// ReadTimeout 读取超时(秒)
	ReadTimeout int `yaml:"read_timeout"`

	// WriteTimeout 写入超时(秒)
	WriteTimeout int `yaml:"write_timeout"`

	// IdleTimeout 空闲超时(秒)
	IdleTimeout int `yaml:"idle_timeout"`
}

// DatabaseConfig 代表数据库配置
type DatabaseConfig struct {
	// Host 数据库主机地址
	Host string `yaml:"host"`

	// Port 数据库端口
	Port int `yaml:"port"`

	// Username 数据库用户名
	Username string `yaml:"username"`

	// Password 数据库密码
	Password string `yaml:"password"`

	// DBName 数据库名称
	DBName string `yaml:"dbname"`

	// SSLMode SSL模式
	SSLMode string `yaml:"sslmode"`

	// MaxOpenConns 最大开放连接数
	MaxOpenConns int `yaml:"max_open_conns"`

	// MaxIdleConns 最大空闲连接数
	MaxIdleConns int `yaml:"max_idle_conns"`

	// ConnMaxLifetime 连接最大生命周期(秒)
	ConnMaxLifetime int `yaml:"conn_max_lifetime"`
}

// WebSocketConfig 代表WebSocket配置
type WebSocketConfig struct {
	// Timeout WebSocket请求超时时间(秒)
	Timeout int `yaml:"timeout"`

	// HeartbeatInterval 心跳检测间隔(秒), 如果超过这个时间没有消息往来系统会自动发送一个心跳包维持长链接
	HeartbeatInterval int `yaml:"heartbeat_interval"`
}

// HeartbeatConfig 代表心跳配置
type HeartbeatConfig struct {
	// Interval 心跳间隔(秒)
	Interval int `yaml:"interval"`

	// Concurrency 请求并发数
	Concurrency int `yaml:"concurrency"`
}

// NewConfig 创建并返回一个新的配置实例
func NewConfig() *Config {
	return &Config{
		WebSocket: WebSocketConfig{
			Timeout: 5, // 默认5秒超时
		},
		Heartbeat: HeartbeatConfig{
			Interval: 30, // 默认30秒心跳间隔
		},
	}
}

// Load 从指定路径加载配置文件
func (c *Config) Load(path string) error {
	// 读取配置文件
	data, err := os.ReadFile(path)
	if err != nil {
		return fmt.Errorf("配置文件读取失败: %v", err)
	}

	// 解析YAML配置
	if err := yaml.Unmarshal(data, c); err != nil {
		return fmt.Errorf("配置文件解析失败: %v", err)
	}

	return nil
}

// GetDatabaseConnectionString 获取数据库连接字符串
func (c *Config) GetDatabaseConnectionString() string {
	// 构建PostgreSQL连接字符串
	return fmt.Sprintf(
		"user=%s password=%s dbname=%s host=%s port=%d sslmode=%s",
		c.Database.Username,
		c.Database.Password,
		c.Database.DBName,
		c.Database.Host,
		c.Database.Port,
		c.Database.SSLMode,
	)
}

// GetWebSocketConfig 获取WebSocket配置
func (c *Config) GetWebSocketConfig() WebSocketConfig {
	return c.WebSocket
}

// GetHeartbeatConfig 获取心跳配置
func (c *Config) GetHeartbeatConfig() HeartbeatConfig {
	return c.Heartbeat
}
