package config

import "time"

type Config struct {
	Log         Log         `mapstructure:"log" json:"log" yaml:"log"`
	Serve       Serve       `mapstructure:"serve" json:"serve" yaml:"serve"`
	Mysql       Mysql       `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
	Redis       Redis       `mapstructure:"redis" json:"redis" yaml:"redis"`
	AliOss      AliOss      `mapstructure:"ali-oss" json:"ali-oss" yaml:"ali-oss"`
	EsClient    EsClient    `mapstructure:"es_client" json:"es_client" yaml:"es_client"`
	Mongo       Mongo       `mapstructure:"mongo" json:"mongo" yaml:"mongo"`
	EtaChartLib EtaChartLib `mapstructure:"eta_chart_lib" json:"eta_chart_lib" yaml:"eta_chart_lib"`
	System      System      `mapstructure:"system" json:"system" yaml:"system"`
	RaiReportLib RaiReportLib `mapstructure:"rai_report_lib" json:"rai_report_lib" yaml:"rai_report_lib"`
}

// Serve gin服务配置
type Serve struct {
	Port      int    `mapstructure:"port" json:"port" yaml:"port" description:"gin开启监听http服务的端口"`
	RunMode   string `mapstructure:"run-mode" json:"run-mode" yaml:"run-mode" description:"gin运行模式的默认，枚举值：debug,release"`
	UseRedis  bool   `mapstructure:"use-redis" json:"use-redis" yaml:"use-redis" description:"是否使用redis"`
	AppName   string `mapstructure:"app-name" json:"app-name" yaml:"app-name" description:"项目名称"`
	StaticDir string `mapstructure:"static-dir" json:"static-dir" yaml:"static-dir" description:"上传的文件存储目录地址"`
	UseMongo  bool   `mapstructure:"use-mongo" json:"use-mongo" yaml:"use-mongo" description:"是否使用mongo"`
}

// Log 日志配置
type Log struct {
	Prefix           string `mapstructure:"prefix" json:"prefix" yaml:"prefix" description:"日志输出前缀"`
	LogFile          bool   `mapstructure:"log-file" json:"logFile" yaml:"log-file" description:""`
	Stdout           string `mapstructure:"stdout" json:"stdout" yaml:"stdout" description:""`
	FileStdout       string `mapstructure:"file-stdout" json:"file-stdout" yaml:"file-stdout" description:""`
	SaveMaxDay       int    `mapstructure:"save-max-day" json:"save-max-day" yaml:"save-max-day" description:"最多保留多少天的日志"`
	CuttingDay       int    `mapstructure:"cutting-day" json:"cutting-day" yaml:"cutting-day" description:"相隔几天切割文件"`
	LogDirPath       string `mapstructure:"log-dir-path" json:"log-dir-path" yaml:"log-dir-path" description:"日志目录"`
	LogSoftLink      string `mapstructure:"log-soft-link" json:"log-soft-link" yaml:"log-soft-link" description:"日志软链接"`
	BinlogDirPath    string `mapstructure:"binlog-dir-path" json:"binlog-dir-path" yaml:"binlog-dir-path" description:"binlog日志目录"`
	BinlogSoftLink   string `mapstructure:"binlog-soft-link" json:"binlog-soft-link" yaml:"binlog-soft-link" description:"binlog日志软链接"`
	FilelogDirPath   string `mapstructure:"filelog-dir-path" json:"filelog-dir-path" yaml:"filelog-dir-path" description:"用户自主记录的日志目录"`
	FilelogSoftLink  string `mapstructure:"filelog-soft-link" json:"filelog-soft-link" yaml:"filelog-soft-link" description:"用户自主记录的日志软链接"`
	MongologDirPath  string `mapstructure:"mongolog-dir-path" json:"mongolog-dir-path" yaml:"mongolog-dir-path" description:"mongo的日志目录"`
	MongologSoftLink string `mapstructure:"mongolog-soft-link" json:"mongolog-soft-link" yaml:"mongolog-soft-link" description:"mongo的日志软链接"`
}

// Mysql 数据库配置
type Mysql struct {
	//LogMode             bool        `mapstructure:"log-mode" json:"log-mode" yaml:"log-mode" description:"是否开启日志"`
	Stdout              bool        `mapstructure:"stdout" json:"stdout" yaml:"stdout" description:"日志是否输出在控制台"`
	DefaultDsnAliasName string      `mapstructure:"default-dsn-alias-name" json:"default-dsn-alias-name" yaml:"default-dsn-alias-name" description:"默认的数据库连接别名"`
	List                []MysqlConn `mapstructure:"list" json:"list" yaml:"list" description:"数据库链接配置列表"`
}

// MysqlConn mysql数据链接配置
type MysqlConn struct {
	Dsn          string `mapstructure:"dsn" json:"dsc" yaml:"dsn" description:"数据库连接配置"`
	AliasName    string `mapstructure:"alias-name" json:"alias-name" yaml:"alias-name" description:"数据库别名"`
	MaxIdleConns int    `mapstructure:"max-idle-conns" json:"max-idle-conns" yaml:"max-idle-conns" description:"最大空闲连接"`
	MaxOpenConns int    `mapstructure:"max-open-conns" json:"max-open-conns" yaml:"max-open-conns" description:"最大连接数"`
}

// Redis redis配置
type Redis struct {
	Address  string `mapstructure:"address" json:"address" yaml:"address" description:"redis服务链接地址"`
	Password string `mapstructure:"password" json:"password" yaml:"password" description:"redis服务密码"`
	Db       int    `mapstructure:"db" json:"db" yaml:"db" description:"默认使用的redis库"`
}

// AliOss aliOss配置
type AliOss struct {
	BucketName      string `mapstructure:"bucket-name" json:"bucket-name" yaml:"bucket-name"`
	EndPoint        string `mapstructure:"end-point" json:"end-point" yaml:"end-point"`
	ImgHost         string `mapstructure:"img-host" json:"img-host" yaml:"img-host" description:"阿里oss主机地址"`
	UploadDir       string `mapstructure:"upload-dir" json:"upload-dir" yaml:"upload-dir" description:"图片上传的文件目录"`
	UploadAudioDir  string `mapstructure:"upload-audio-dir" json:"upload-audio-dir" yaml:"upload-audio-dir" description:"视频上传的文件目录"`
	AccessKeyId     string `mapstructure:"access-key-id" json:"access-key-id" yaml:"access-key-id" description:"access-key-id"`
	AccessKeySecret string `mapstructure:"access-key-secret" json:"access-key-secret" yaml:"access-key-secret" description:"access-key-secret"`
}

// EsClient es客户端配置
type EsClient struct {
	// 终端地址
	Endpoints string `json:"endpoints" yaml:"endpoints"`
	// 用户
	Username string `json:"username" yaml:"username"`
	// 密码
	Password string `json:"password" yaml:"password"`
	// 超时时间，单位ms
	Timeout time.Duration `json:"timeout" yaml:"timeout"`
	// es日志目录
	Log string `json:"log" yaml:"log"`
	// 索引前缀
	Prefix string `json:"prefix" yaml:"prefix"`
}

// Mongo
// @Description: mongo配置
type Mongo struct {
	Url           string `mapstructure:"url" json:"url" yaml:"url" description:"mongo地址url"`
	AuthMechanism string `mapstructure:"auth_mechanism" json:"auth_mechanism" yaml:"auth_mechanism" description:"鉴权方式"`
	AuthSource    string `mapstructure:"auth-source" json:"auth-source" yaml:"auth-source" description:"认证数据库"`
	Database      string `mapstructure:"database" json:"database" yaml:"database" description:"默认数据库"`
	Username      string `mapstructure:"username" json:"username" yaml:"username" description:"用户名"`
	Password      string `mapstructure:"password" json:"password" yaml:"password" description:"密码"`
}

type EtaChartLib struct {
	ServerUrl string `mapstructure:"server_url" json:"server_url" yaml:"server_url" description:"项目请求地址"`
	AppNameEn string `mapstructure:"app_name_en" json:"app_name_en" yaml:"app_name_en" description:"项目名称"`
	Md5Key    string `mapstructure:"md5_key" json:"md5_key" yaml:"md5_key" description:"项目密钥"`
}

type System struct {
	ChromePath string `mapstructure:"chrome-path" json:"chrome-path" yaml:"chrome-path" description:"chrome路径"`
}

type RaiReportLib struct {
	ServerUrl string `mapstructure:"server_url" json:"server_url" yaml:"server_url" description:"权益报告查看地址"`
	Token     string `mapstructure:"token" json:"token" yaml:"token" description:"权益报告查看token"`
}
