package config

import "github.com/gogf/gf/v2/database/gdb"

// 使用 mapstructure 标签可以指定 confgi 的 key 名

type (
	AppConfig struct {
		Server               Server               `json:"server" mapstructure:"server"`
		Password             Password             `json:"password" mapstructure:"password"`
		Databases            Databases            `json:"databases" mapstructure:"databases"`
		MainControllerClient MainControllerClient `json:"mainControllerClient" mapstructure:"mainControllerClient"`
		Togocdn              Togocdn              `json:"togocdn" mapstructure:"togocdn"`
		Logger               Logger               `json:"logger" mapstructure:"logger"`
		LicenseConf          LicenseConf          `json:"licenseConf" mapstructure:"licenseConf"`
		Zap                  Zap                  `json:"zap" mapstructure:"zap"`
		Tty                  Tty                  `json:"tty" mapstructure:"tty"`
		DeviceInfo           DeviceInfo           `json:"deviceInfo" mapstructure:"deviceInfo"`
		Firefox              Firefox              `json:"firefox" mapstructure:"firefox"`
		MessageInterval      int                  `json:"MessageInterval" mapstructure:"MessageInterval"`
		IotServer            IotServer            `json:"iotServer" mapstructure:"iotServer"`
		RabbitMq             RabbitMq             `json:"rabbitMq" mapstructure:"rabbitMq"`
		LiKong               LiKong               `json:"liKong" mapstructure:"li-kong"`
		HuYi                 HuYi                 `json:"huYi" mapstructure:"hu-yi"`
		AliSms               AliSms               `json:"aliSms" mapstructure:"ali-sms"`
		Gdb                  gdb.Config           `json:"gdb" mapstructure:"gdb"`
	}
)

type (
	Password struct {
		Enabled bool `json:"enabled" mapstructure:"enabled"`
	}
)

type (
	Server struct {
		Port    int    `json:"port" mapstructure:"port"`
		Static  string `json:"static" mapstructure:"static"`
		IsLocal bool   `json:"isLocal" mapstructure:"is-local"`
	}

	Databases struct {
		Mode  string          `json:"mode" mapstructure:"mode"`
		Nodes []DatabasesNode `json:"nodes" mapstructure:"nodes"`
	}
	DatabasesNode struct {
		DbType          string `json:"DbType" mapstructure:"DbType"`
		IsMaster        bool   `json:"IsMaster" mapstructure:"IsMaster"`
		Dsn             string `json:"Dsn" mapstructure:"Dsn"`
		SqlMaxIdleConns int    `json:"sqlMaxIdleConns" mapstructure:"sqlMaxIdleConns"`
		SqlMaxOpenConns int    `json:"sqlMaxOpenConns" mapstructure:"sqlMaxOpenConns"`
		SqlLogLevel     int    `json:"sqlLogLevel" mapstructure:"sqlLogLevel"`
	}

	MainControllerClient struct {
		ServerHost string `json:"server_host" mapstructure:"server_host"`
		SecretKey  string `json:"secret_key" mapstructure:"secret_key"`
	}

	Togocdn struct {
		Client struct {
			Priority   int      `json:"Priority" mapstructure:"Priority"`
			ModuleName string   `json:"ModuleName" mapstructure:"ModuleName"`
			ServerUrls []string `json:"ServerUrls" mapstructure:"ServerUrls"`
		} `json:"client" mapstructure:"client"`
	}

	Logger struct {
		Path                 string        `json:"path" mapstructure:"path"`
		File                 string        `json:"file" mapstructure:"file"`
		Prefix               string        `json:"prefix" mapstructure:"prefix"`
		Level                string        `json:"level" mapstructure:"level"`
		TimeFormat           string        `json:"timeFormat" mapstructure:"timeFormat"`
		CtxKeys              []interface{} `json:"ctxKeys" mapstructure:"ctxKeys"`
		Header               bool          `json:"header" mapstructure:"header"`
		Stdout               bool          `json:"stdout" mapstructure:"stdout"`
		RotateSize           int           `json:"rotateSize" mapstructure:"rotateSize"`
		RotateExpire         string        `json:"rotateExpire" mapstructure:"rotateExpire"`
		RotateBackupLimit    int           `json:"rotateBackupLimit" mapstructure:"rotateBackupLimit"`
		RotateBackupExpire   string        `json:"rotateBackupExpire" mapstructure:"rotateBackupExpire"`
		RotateBackupCompress int           `json:"rotateBackupCompress" mapstructure:"rotateBackupCompress"`
		RotateCheckInterval  string        `json:"rotateCheckInterval" mapstructure:"rotateCheckInterval"`
		StdoutColorDisabled  bool          `json:"stdoutColorDisabled" mapstructure:"stdoutColorDisabled"`
		WriterColorEnable    bool          `json:"writerColorEnable" mapstructure:"writerColorEnable"`
	}

	LicenseConf struct {
		LicenseServerUrl string `json:"LicenseServerUrl" mapstructure:"LicenseServerUrl"`
		LicenseKey       string `json:"LicenseKey" mapstructure:"LicenseKey"`
	}

	Tty struct {
		SerialPortAddress string `json:"serialPortAddress" mapstructure:"serialPortAddress"`
		BaudRate          int    `json:"baudRate" mapstructure:"baudRate"`
	}

	DeviceInfo struct {
		DeviceId  string `json:"deviceId" mapstructure:"deviceId"`
		Version   string `json:"version" mapstructure:"version"`
		MeterAddr string `json:"meterAddr" mapstructure:"meterAddr"`
		MeterFirm string `json:"meterFirm" mapstructure:"meterFirm"`
		LoopCount int    `json:"loopCount" mapstructure:"loopCount"`
	}

	Firefox struct {
		DebPkgPath       string `json:"DebPkgPath" mapstructure:"DebPkgPath"`
		DebPkgName       string `json:"DebPkgName" mapstructure:"DebPkgName"`
		InstallShellPath string `json:"InstallShellPath" mapstructure:"InstallShellPath"`
	}

	IotServer struct {
		ServerUrl string `json:"serverUrl" mapstructure:"serverUrl"`
		Port      string `json:"port" mapstructure:"port"`
	}

	RabbitMq struct {
		Server   string `json:"server" mapstructure:"server"`
		Port     int    `json:"port" mapstructure:"port"`
		Username string `json:"username" mapstructure:"username"`
		Password string `json:"password" mapstructure:"password"`
	}

	// LiKong 接口客户端
	LiKong struct {
		BaseURL      string `json:"baseURL" mapstructure:"base-url"`
		TenantID     string `json:"tenantID" mapstructure:"tenant-id"`
		ClientID     string `json:"clientID" mapstructure:"client-id"`
		ClientSecret string `json:"clientSecret" mapstructure:"client-secret"`
		Username     string `json:"username" mapstructure:"username"`
		Password     string `json:"password" mapstructure:"password"`
		ApiPrefix    string `json:"api-prefix" mapstructure:"api-prefix"`
	}
	HuYi struct {
		BaseURL    string `json:"baseURL" mapstructure:"base-url"`
		AppId      string `json:"appID" mapstructure:"app-id"`
		AppKey     string `json:"appKey" mapstructure:"app-key"`
		TemplateId string `json:"templateId" mapstructure:"template-id"`
	}
	AliSms struct {
		// AccessKeyID RAM账号AccessKey ID
		AccessKeyID string `json:"accessKeyID" mapstructure:"access-key-id"`

		// AccessKeySecret RAM账号AccessKey Secret
		AccessKeySecret string `json:"accessKeySecret" mapstructure:"access-key-secret"`

		// SignName 短信签名（审核通过的名称）
		SignName string `json:"signName" mapstructure:"sign-name"`

		// WarnTemplateId 告警短信模板ID
		WarnTemplateId string `json:"warnTemplateId" mapstructure:"warn-template-id"`

		// InfoTemplateId 信息短信模板ID
		InfoTemplateId string `json:"infoTemplateId" mapstructure:"info-template-id"`

		// Endpoint 短信服务接入地址（默认：dysmsapi.aliyuncs.com）
		Endpoint string `json:"endpoint" mapstructure:"endpoint"`
	}
)
