package config

import (
	"encoding/json"
	"io/ioutil"
	"log"
)

var Config struct {
	App         AppConfig         `json:"app"`
	Mysql       MysqlConfig       `json:"mysql"`
	Redis       RedisConfig       `json:"redis"`
	Certificate CertificateConfig `json:"certificate"`
	Log         LogConfig         `json:"log"`
	Role        RoleConfig        `json:"role"`
	Smtp        SmtpConfig        `json:"smtp"`
	AliyunOss   AliyunOssConfig   `json:"aliyun_oss"`
	Others      OthersConfig      `json:"others"`
}

type AppConfig struct {
	AppName  string `json:"appname"`
	Issuer   string `json:"issuer"`
	HttpPort string `json:"httpport"`
	NetType  string `json:"net"`
	Mode     string `json:"mode"`
}

type MysqlConfig struct {
	UserName string `json:"dbuser"`
	Password string `json:"dbpwd"`
	Database string `json:"dbname"`
	Host     string `json:"dbhost"`
	MaxIdle  int    `json:"maxidle"`
	MaxConn  int    `json:"maxconn"`
}

type RedisConfig struct {
	MaxIdle            int    `json:"max_idle"`
	MaxActive          int    `json:"max_active"`
	IdleTimeout        int    `json:"idle_timeout"`
	Address            string `json:"address"`
	Password           string `json:"password"`
	DialReadTimeout    int    `json:"dial_read_timeout"`
	DialWriteTimeout   int    `json:"dial_write_timeout"`
	DialConnectTimeout int    `json:"dial_connect_timeout"`
	Database           int    `json:"database"`
}

type CertificateConfig struct {
	ServerCrt          string `json:"server_crt"`
	ServerPrivateKey   string `json:"server_private_key"`
	PasswordPrivateKey string `json:"pwd_private_key"`
	JwtPrivatekey      string `json:"jwt_private_key"`
}

type LogConfig struct {
	Level string `json:"level"`
}

type RoleConfig struct {
	Administrators []string `json:"administrators"`
	Publishers     []string `json:"publishers"`
}

type SmtpConfig struct {
	FromEmail string `json:"fromemail"`
	Host      string `json:"host"`
	Port      int    `json:"port"`
	UserName  string `json:"username"`
	Password  string `json:"password"`
}

type AliyunOssConfig struct {
	RegionId        string `json:"region_id"`
	Endpoint        string `json:"endpoint"`
	AccessKeyId     string `json:"access_key_id"`
	AccessKeySecret string `json:"access_key_secret"`
	Bucket          string `json:"bucket"`
	Arn             string `json:"arn"` // 阿里云 角色 ARN值
}

type OthersConfig struct {
	LoginUrl string `json:"manage_login_url"` // 管理后台登陆地址
}

func init() {
	data, err := ioutil.ReadFile("./config/config.json")
	if err != nil {
		log.Fatalf("加载配置文件失败: %v", err)
	}
	err = json.Unmarshal(data, &Config)
	if err != nil {
		log.Fatalf("解析配置文件失败: %v", err)
	}
}
