package config

import (
	"net"

	"git.apinb.com/bsm-sdk/core/conf"
	"git.apinb.com/bsm-sdk/core/crypto/encipher"
	"git.apinb.com/bsm-sdk/core/env"
)

var (
	Spec SrvConfig // 全局服务配置实例
)

// SrvConfig 服务配置结构体
type SrvConfig struct {
	conf.Base    `yaml:",inline"`        // 基础配置（服务名、端口、缓存等）
	Databases    *conf.DBConf            `yaml:"Databases"`    // 数据库配置
	MicroService *conf.MicroServiceConf  `yaml:"MicroService"` // 微服务配置
	Rpc          map[string]conf.RpcConf `yaml:"Rpc"`          // RPC服务配置
	Gateway      *conf.GatewayConf       `yaml:"Gateway"`      // 网关配置
	Apm          *conf.ApmConf           `yaml:"APM"`          // APM监控配置
	Etcd         *conf.EtcdConf          `yaml:"Etcd"`         // Etcd配置
}

// New 初始化服务配置
func New(srvKey string) {
	// 初始化配置 创建一个新的配置实例，用于服务配置
	conf.New(srvKey, &Spec)

	// 配置校验 服务IP,端口; 端口如果不合规，则随机分配端口
	Spec.Port = conf.CheckPort(Spec.Port)
	Spec.BindIP = conf.CheckIP(Spec.BindIP)
	Spec.Addr = net.JoinHostPort(Spec.BindIP, Spec.Port)

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

	// 初始化加密SecretKey
	encipher.New(env.Runtime.JwtSecretKey)

	conf.PrintInfo(Spec.Addr)
}
