package configs

import (
	"fmt"
	"github.com/go-ini/ini"
	"log"
	"time"
)

type Server struct {
	RunMode      string
	HttpPort     int
	ReadTimeout  time.Duration
	WriteTimeout time.Duration
}

type Database struct {
	Type        string `ini:"type"`
	UserName    string `ini:"user_name"`
	Password    string `ini:"password"`
	Host        string `ini:"host"`
	Database    string `ini:"database"`
	TablePrefix string `ini:"table_prefix"`
}

type Redis struct {
	Host        string        `ini:"host"`
	Password    string        `ini:"password"`
	MaxIdle     int           `ini:"max_idle"`
	MaxActive   int           `ini:"max_active"`
	IdleTimeout time.Duration `ini:"idle_timeout"`
}

type ES struct {
	Url            string `ini:"url"`
	GoodsIndexName string `ini:"goods_index_name"`
}

type RabbitMQ struct {
	Url string `ini:"url"`
}

type Api struct {
	Goods   string `ini:"goods"`
	Upload  string `ini:"upload"`
	ApiPort string `ini:"api_port"`
	Mode    string `ini:"mode"`
}

type Oss struct {
	UploadKey string `ini:"upload_key"`
}

var DatabaseSetting = &Database{}
var RedisSetting = &Redis{}
var RabbitMQSetting = &RabbitMQ{}
var ESSetting = &ES{}
var ApiSetting = &Api{}
var OssSetting = &Oss{}

var (
	cfg *ini.File
)

// Setup initialize the configuration instance
func Setup(filePath string) {
	var err error
	cfg, err = ini.Load(filePath)
	if err != nil {
		panic(fmt.Sprintf("解析配置文件失败: %v", err))
	}

	mapTo("database", DatabaseSetting)
	mapTo("redis", RedisSetting)
	mapTo("rabbitmq", RabbitMQSetting)
	mapTo("es", ESSetting)
	mapTo("api", ApiSetting)
	mapTo("oss", OssSetting)

	RedisSetting.IdleTimeout = RedisSetting.IdleTimeout * time.Second
}

// mapTo map section
func mapTo(section string, v interface{}) {
	err := cfg.Section(section).MapTo(v)
	if err != nil {
		log.Fatalf("Cfg.MapTo %s err: %v", section, err)
	}
}