package config

import (
	"time"

	"github.com/creasty/defaults"
)

type RootConfig struct {
	Log LogConfig `yaml:"log"`

	Lark LarkConfig `yaml:"lark"`

	Services Services `yaml:"services"`
}

type DatabaseConfig struct {
	Host     string `yaml:"host" validate:"required"`
	Port     uint16 `yaml:"port" validate:"required"`
	User     string `yaml:"user" validate:"required"`
	Password string `yaml:"password" validate:"required"` // TODO: read from AWS Secret Manager
	Database string `yaml:"database" validate:"required"`

	TLSConfigKey    string        `yaml:"tlsConfigKey"`
	DailTimeout     time.Duration `yaml:"dailTimeout" default:"60s"`
	ReadTimeout     time.Duration `yaml:"readTimeout" default:"30s"`
	WriteTimeout    time.Duration `yaml:"writeTimeout" default:"30s"`
	ConnMaxLifetime time.Duration `yaml:"connMaxLifetime" default:"3m"`
	MaxIdleConns    int           `yaml:"maxIdleConns" default:"100"`
	MaxOpenConns    int           `yaml:"maxOpenConns" default:"100"`

	LogLevel         int           `yaml:"logLevel" default:"4"` // 1: silent, 2: error, 3: warn, 4: info
	LogSlowThreshold time.Duration `yaml:"logSlowThreshold" default:"200ms"`
	TraceQuerySQL    bool          `yaml:"traceQuerySQL" default:"false"`
}

type LogConfig struct {
	Level int16 `yaml:"level" default:"0"`
}

type LarkConfig struct {
	AppCode   string `yaml:"appCode"`
	AppSecret string `yaml:"appSecret"` // READ FROM ASM
}

func NewDefault() (*RootConfig, error) {
	conf := &RootConfig{}
	err := defaults.Set(conf)
	return conf, err
}
