package config

import (
	"flag"
	"fmt"
	"github.com/PandaXGO/PandaKit/biz"
	"github.com/PandaXGO/PandaKit/utils"
	"path/filepath"
)

func InitConfig(configFilePath string) *Config {
	// 获取启动参数中，配置文件的绝对路径
	path, _ := filepath.Abs(configFilePath)
	startConfigParam = &CmdConfigParam{ConfigFilePath: path}
	// 读取配置文件信息
	yc := &Config{}
	if err := utils.LoadYml(startConfigParam.ConfigFilePath, yc); err != nil {
		panic(any(fmt.Sprintf("读取配置文件[%s]失败: %s", startConfigParam.ConfigFilePath, err.Error())))
	}
	// 校验配置文件内容信息
	yc.Valid()

	return yc

}

// 启动配置参数
type CmdConfigParam struct {
	ConfigFilePath string // -e  配置文件路径
}

// 启动可执行文件时的参数
var startConfigParam *CmdConfigParam

// yaml配置文件映射对象
type Config struct {
	App    *App    `yaml:"app"`
	Server *Server `yaml:"server"`
	Queue  *Queue  `yaml:"queue"`
	Jwt    *Jwt    `yaml:"jwt"`
	Redis  *Redis  `yaml:"redis"`
	Mysql  *Mysql  `yaml:"mysql"`
	Oss    *Oss    `yaml:"oss"`
	Taos   *Taos   `yaml:"taos"`
	Mqtt   *Mqtt   `yaml:"mqtt"`
	Casbin *Casbin `yaml:"casbin"`
	Gen    *Gen    `yaml:"gen"`
	Ys     *Ys     `yaml:"ys"`
	Log    *Log    `yaml:"log"`
}

// 配置文件内容校验
func (c *Config) Valid() {
	biz.IsTrue(c.Jwt != nil, "配置文件的[jwt]信息不能为空")
	c.Jwt.Valid()
}

// 获取执行可执行文件时，指定的启动参数
func getStartConfig() *CmdConfigParam {
	configFilePath := flag.String("e", "./config.yml", "配置文件路径，默认为可执行文件目录")
	flag.Parse()
	// 获取配置文件绝对路径
	path, _ := filepath.Abs(*configFilePath)
	sc := &CmdConfigParam{ConfigFilePath: path}
	return sc
}
