package config

import (
	"bytes"
	"encoding/json"
	"epur-pay/model"
	"fmt"
	"gopkg.in/ini.v1"
)

type Config struct {
	Common struct {
		RunMode      string `yaml:"RunMode"`
		LogFilePath  string `yaml:"LogFilePath"` //日志根路径
		Domain       string `yaml:"Domain"`
		ResourcePath string `yaml:"ResourcePath"`
	} `yaml:"Common"`
	ApiServer model.ListenServer `yaml:"ApiServer"`
	Rds       model.Rds          `yaml:"Rds"`
	Redis     model.Redis        `yaml:"Redis"`
}

var Cf = Config{}

func New(Name string) {

	var (
		cfg        *ini.File
		err        error
		configPath string
	)

	if Cf.Common.RunMode == "debug" {
		configPath = fmt.Sprintf("config/%s_test.ini", Name)
	} else {
		configPath = fmt.Sprintf("config/%s.ini", Name)
	}

	if cfg, err = ini.Load(configPath); err != nil {
		panic(err)
	}

	mapTo("Common", &Cf.Common, cfg)
	mapTo("ApiServer", &Cf.ApiServer, cfg)
	mapTo("Rds", &Cf.Rds, cfg)
	mapTo("Redis", &Cf.Redis, cfg)

	fmt.Println("Cf -> config load success.")
}

func (conf *Config) String() string {
	b, err := json.Marshal(*conf)
	if err != nil {
		return fmt.Sprintf("%+v", *conf)
	}
	var out bytes.Buffer
	err = json.Indent(&out, b, "", "    ")
	if err != nil {
		return fmt.Sprintf("%+v", *conf)
	}
	return out.String()
}

// mapTo map section
func mapTo(section string, v interface{}, cfg *ini.File) {
	err := cfg.Section(section).MapTo(v)
	if err != nil {
		panic(err)
	}
}