package config

import (
	"encoding/json"
	"fmt"
	"os"
)

type Config struct {
	AdminToken string `json:"adminToken"`
	AuthAPIURL string `json:"authApiUrl"`

	// 数据库 DSN，为空时回退到测试数据库。
	// 格式：user:pass@tcp(host:port)/dbname?charset=utf8mb4&parseTime=True&loc=Local
	DatabaseDSN string `json:"databaseDsn"`
}

// 各环境默认 DSN。
const (
	TestDSN = "mengyastore-test:mengyastore-test@tcp(10.1.1.100:3306)/mengyastore-test?charset=utf8mb4&parseTime=True&loc=Local"
	ProdDSN = "mengyastore:mengyastore@tcp(192.168.1.100:3306)/mengyastore?charset=utf8mb4&parseTime=True&loc=Local"
)

func Load(path string) (*Config, error) {
	var cfg Config
	data, err := os.ReadFile(path)
	if err == nil {
		if jsonErr := json.Unmarshal(data, &cfg); jsonErr != nil {
			return nil, fmt.Errorf("解析配置文件 %s 失败: %w", path, jsonErr)
		}
	}
	// 文件不存在时使用默认值，环境变量在下方仍优先生效。

	if cfg.AdminToken == "" {
		cfg.AdminToken = "changeme"
	}
	// DATABASE_DSN 环境变量优先于配置文件。
	if dsn := os.Getenv("DATABASE_DSN"); dsn != "" {
		cfg.DatabaseDSN = dsn
	}
	if cfg.DatabaseDSN == "" {
		cfg.DatabaseDSN = TestDSN
	}
	return &cfg, nil
}
