package config

import (
	"github.com/BurntSushi/toml"
	"github.com/qit-team/snow-core/config"
	"os"
)

const (
	ProdEnv  = "production" //线上环境
	BetaEnv  = "beta"       //beta环境
	DevEnv   = "develop"    //开发环境
	LocalEnv = "local"      //本地环境
)

var srvConf *Config

// ------------------------配置文件解析
type Config struct {
	ServiceName             string             `toml:"ServiceName"`
	Env                     string             `toml:"Env"`
	Debug                   bool               `toml:"Debug"`
	PrometheusCollectEnable bool               `toml:"PrometheusCollectEnable"`
	SkyWalkingOapServer     string             `toml:"SkyWalkingOapServer"`
	TimeOut                 int64              `toml:"TimeOut"`
	Log                     config.LogConfig   `toml:"Log"`
	Redis                   config.RedisConfig `toml:"Redis"`
	Mns                     config.MnsConfig   `toml:"AliMns"`
	Db                      config.DbConfig    `toml:"Db"`
	Api                     config.ApiConfig   `toml:"Api"`
	Admin                   config.ApiConfig   `toml:"Admin"`
	Nacos                   Nacos              `toml:"Nacas"`
	Rpc                     Rpc                `toml:"Rpc"`
	AppKey                  string             `toml:"AppKey"`
	Sm2                     Sm2                `toml:"Sm2"`
	OpenApiMarketConfig     MarketConfig       `toml:"MarketConfig"`
	OpenApi                 OpenApi            `toml:"OpenApi"`
	Jwt                     Jwt                `toml:"Jwt"`
	AliOss                  AliOss             `toml:"AliOss"`
	AdminGate               []string           `toml:"AdminGate"`
	CronConfig              CronConfig         `toml:"CronConfig"`
	PayService              PayService         `toml:"PayService"`
}

type AliOss struct {
	AccessKey       string
	AccessKeySecret string
	EndPoint        string
	BucKet          string
	Domain          string
	Dir             string
}

type Jwt struct {
	SecretKey string
}

type OpenApi struct {
	MerchantId string
	SecretKey  string
	IsProd     bool
	NotifyUrl  string
	TimeOut    int
}

type MarketConfig struct {
	AppId     string `json:"app_id"`   //APP ID
	Sign      string `json:"sign"`     //签名
	ReqCode   string `json:"req_code"` //固定值:voucher.create
	MemId     string `json:"mem_id"`   //商户号
	PosId     string `json:"pos_id"`   //商户方平台号
	Host      string `json:"-"`
	SecretKey string
}

type Sm2 struct {
	PublicKey  string
	PrivateKey string
}

type Rpc struct {
	User string
}
type Nacos struct {
	Url  string
	Port int64
}

type CronConfig struct {
	CloseOrderTime   int `toml:"CloseOrderTime"`
	QueryOrderTime   int `toml:"QueryOrderTime"`
	ConcurrentNumber int `toml:"ConcurrentNumber"`
}

type PayService struct {
	Host   string `toml:"Host"`
	IsProd bool   `toml:"IsProd"`
}

func newConfig() *Config {
	return new(Config)
}

// ------------------------ 加载配置 ------------------------//
func Load(path string) (*Config, error) {
	_, err := os.Stat(path)
	if err != nil {
		return nil, err
	}

	conf := newConfig()
	if _, err := toml.DecodeFile(path, conf); err != nil {
		return nil, err
	}
	srvConf = conf
	return conf, nil
}

// 当前配置
func GetConf() *Config {
	return srvConf
}

// 是否调试模式
func IsDebug() bool {
	return srvConf.Debug
}

// 当前环境,默认本地开发
func GetEnv() string {
	if srvConf.Env == "" {
		return LocalEnv
	}
	return srvConf.Env
}

// 是否当前环境
func IsEnvEqual(env string) bool {
	return GetEnv() == env
}