package config

type Config struct {
	Stage         string `mapstructure:"stage" validate:"required"`
	LogLevel      string `mapstructure:"log-level" default:"info"`
	CloudProvider string `mapstructure:"cloud-provider" default:"aws"`
	Region        string `mapstructure:"region" default:"us-east-1"`
	K8sName       string `mapstructure:"k8s-name" validate:"required"`
	EnableRcu     bool   `mapstructure:"enable-rcu" default:"false"`
	EnableIASku   bool   `mapstructure:"enable-ia-sku" default:"false"`
	EnableDDBMeta bool   `mapstructure:"enable-ddb-meta" default:"false"`

	Server        ServerConfig        `mapstructure:"server"`
	Store         StoreConfig         `mapstructure:"store"`
	Repo          RepositoryConfig    `mapstructure:"repo"`
	Report        ReportConfig        `mapstructure:"report"`
	Query         QueryEngineConfig   `mapstructure:"query"`
	RcuController RcuControllerConfig `mapstructure:"rcu-controller"`
	DBLevelRU     DBLevelRUConfig     `mapstructure:"db-level-ru"`
}

type ServerConfig struct {
	MetricAddress  string `mapstructure:"metric-address" default:":9091"`
	MetaAddress    string `mapstructure:"meta-address" default:":8080"`
	MonitorAddress string `mapstructure:"monitor-address" default:":9090"`
	RcuHost        string `mapstructure:"rcu-host" default:"rcu-controller"`
	RcuPort        int    `mapstructure:"rcu-port" default:"8081"`
}

type StoreConfig struct {
	TickSeconds int            `mapstructure:"tick-seconds" default:"60"`
	S3Bucket    string         `mapstructure:"s3-bucket" validate:"required"` // oss or s3 bucket name
	Local       LocalConfig    `mapstructure:"local"`
	Rcu         RcuStoreConfig `mapstructure:"rcu"`
}

type LocalConfig struct {
	MaxRotateSeconds int    `mapstructure:"max-rotate-seconds" default:"600"`
	TickSeconds      int    `mapstructure:"tick-seconds" default:"30"`
	Filename         string `mapstructure:"filename" validate:"required"`
	// Max size for a single file, in MB.
	MaxSize int `mapstructure:"max-size" default:"10"`
	// Max log keep days, default is never deleting.
	MaxDays int `mapstructure:"max-days" default:"1"`
	// Maximum number of old log files to retain.
	MaxBackups  int `mapstructure:"max-backups" default:"5"`
	MemoryLimit int `mapstructure:"memory-limit" default:"64"`
	WriteBatch  int `mapstructure:"write-batch" default:"1000"`
}

type RepositoryConfig struct {
	DynamodbTable   string `mapstructure:"dynamodb-table" validate:"required"`
	CacheFile       string `mapstructure:"cache-file" default:""`
	CacheTTLMinutes int    `mapstructure:"cache-ttl-minutes" default:"30"`
	MetaServerHost  string `mapstructure:"meta-server-host" default:"meta-service.tidb-admin"`
	MetaServerPort  int    `mapstructure:"meta-server-port" default:"8080"`
	PdMetaStoreHost string `mapstructure:"pd-meta-store-host" default:"meta-store.tidb-admin"`
	PdMetaStorePort int    `mapstructure:"pd-meta-store-port" default:"9088"`
}

type ReportConfig struct {
	TickSeconds     int      `mapstructure:"tick-seconds" default:"60"`
	StoreMembers    []string `mapstructure:"store-members" validate:"required"`
	EnableReporter  bool     `mapstructure:"enable-reporter" default:"false"`
	ReporterEnvType string   `mapstructure:"reporter-env-type" default:"dev"`
	PocFreePercent  int      `mapstructure:"poc-free-percent" default:"0"`
	PocTenantIDs    []uint64 `mapstructure:"poc-tenant-ids" default:"[]"`
}

type QueryEngineConfig struct {
	Directory   string `mapstructure:"directory" validate:"required"`
	MemoryLimit int    `mapstructure:"memory-limit" default:"128"`
	Shards      int    `mapstructure:"shards" default:"1"`
}

type RcuStoreConfig struct {
	Directory  string `mapstructure:"directory"`
	WriteBatch int    `mapstructure:"write-batch" default:"1000"`
}

type RcuControllerConfig struct {
	PushMetricAddr         string `mapstructure:"push-metric-addr" default:"http://serverless-metering:9091"`
	PushMetricInterval     int    `mapstructure:"push-metric-interval" default:"10"`
	UpdateCapacityInterval int    `mapstructure:"update-capacity-interval" default:"30"`
}

type DBLevelRUConfig struct {
	Enable    bool     `mapstructure:"enable" default:"false"`
	TenantIDs []uint64 `mapstructure:"tenant-ids" default:"[]"`
}
