package config

import (
	"git.apinb.com/bsm-sdk/core/conf"
	"git.apinb.com/bsm-sdk/core/env"
)

var (
	Spec SrvConfig
)

type SrvConfig struct {
	conf.Base `yaml:",inline"`
	Databases *conf.DBConf            `yaml:"Databases"`
	Rpc       map[string]conf.RpcConf `yaml:"Rpc"`
	Apm       *conf.ApmConf           `yaml:"APM"`
	Etcd      *conf.EtcdConf          `yaml:"Etcd"`
	SecretKey string
	// InitRootUser 是否初始化超级管理员用户；未配置时默认 true
	InitRootUser *bool `yaml:"InitRootUser,omitempty"`
}

// InitRootUserEnabled 是否执行 root 用户初始化
func InitRootUserEnabled() bool {
	if Spec.InitRootUser == nil {
		return false
	}
	return *Spec.InitRootUser
}

func New(srvKey string) {

	// 初始化通用配置 创建一个新的配置实例，用于服务配置
	conf.New(srvKey, &Spec)
	// 配置校验 服务端口如果不合规，则随机分配端口
	Spec.Port = conf.CheckPort(Spec.Port)

	// 初始化自定义环境变量
	Spec.SecretKey = env.Runtime.JwtSecretKey

	// InitRootUser 配置说明：
	// 由于bool类型零值是false，如果配置文件中未设置该字段，默认值为false
	// 为了保持向后兼容和默认启用初始化，我们采用以下策略：
	// - 如果配置文件中显式设置为false，则禁用初始化
	// - 如果配置文件中未设置或设置为true，则启用初始化
	// 注意：InitRootUserData函数内部已有幂等性检查，重复执行是安全的

	// 配置校验 服务名称地址及监听地址不能为空
	conf.NotNil(Spec.Service, Spec.Cache)
}
