package utils

import (
	"os"

	"github.com/spf13/viper"
)

type Config struct {
	Server   ServerConfig
	Database DatabaseConfig
	JWT      JWTConfig
	Email    EmailConfig
	Upload   UploadConfig
	Site     SiteConfig
}

type ServerConfig struct {
	Port string
	Mode string
}

type DatabaseConfig struct {
	Type string
	Path string
}

type JWTConfig struct {
	Secret string
	Expire string
}

type EmailConfig struct {
	Host     string
	Port     int
	Username string
	Password string
}

type UploadConfig struct {
	Path string
}

type SiteConfig struct {
	Title       string `mapstructure:"title"`
	Description string `mapstructure:"description"`
	BaseURL     string `mapstructure:"base_url"`
	ICP         string `mapstructure:"icp"`
	Copyright   string `mapstructure:"copyright"`
	Logo        string `mapstructure:"logo"`
	Favicon     string `mapstructure:"favicon"`
}

func LoadConfig() (*Config, error) {
	viper.SetConfigName("config")
	viper.SetConfigType("yaml")
	viper.AddConfigPath("./config")

	// 读取环境变量
	viper.AutomaticEnv()

	if err := viper.ReadInConfig(); err != nil {
		return nil, err
	}

	config := &Config{}
	if err := viper.Unmarshal(config); err != nil {
		return nil, err
	}

	// 环境变量优先
	if port := os.Getenv("SERVER_PORT"); port != "" {
		config.Server.Port = port
	}

	return config, nil
}
