package dto

import "time"

// common
type DBConfUpdateByFile struct {
	Type     string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mysql-cluster postgresql-cluster redis-cluster"`
	Database string `json:"database" validate:"required"`
	File     string `json:"file"`
}
type ChangeDBInfo struct {
	ID       uint   `json:"id"`
	From     string `json:"from" validate:"required,oneof=local remote"`
	Type     string `json:"type" validate:"required,oneof=mysql mariadb postgresql redis mongodb mysql-cluster postgresql-cluster redis-cluster"`
	Database string `json:"database" validate:"required"`
	Value    string `json:"value" validate:"required"`
}

type DBBaseInfo struct {
	Name          string `json:"name"`
	ContainerName string `json:"containerName"`
	Port          int64  `json:"port"`
}

// mysql
type MysqlDBSearch struct {
	PageInfo
	Info     string `json:"info"`
	Database string `json:"database" validate:"required"`
	OrderBy  string `json:"orderBy" validate:"required,oneof=name createdAt"`
	Order    string `json:"order" validate:"required,oneof=null ascending descending"`
}

type MysqlDBInfo struct {
	ID          uint      `json:"id"`
	CreatedAt   time.Time `json:"createdAt"`
	Name        string    `json:"name"`
	From        string    `json:"from"`
	MysqlName   string    `json:"mysqlName"`
	Format      string    `json:"format"`
	Collation   string    `json:"collation"`
	Username    string    `json:"username"`
	Password    string    `json:"password"`
	Permission  string    `json:"permission"`
	IsDelete    bool      `json:"isDelete"`
	Description string    `json:"description"`
}

type MysqlOption struct {
	ID       uint   `json:"id"`
	From     string `json:"from"`
	Type     string `json:"type"`
	Database string `json:"database"`
	Name     string `json:"name"`
}

type MysqlDBCreate struct {
	Name        string `json:"name" validate:"required"`
	From        string `json:"from" validate:"required,oneof=local remote"`
	Database    string `json:"database" validate:"required"`
	Format      string `json:"format" validate:"required"`
	Collation   string `json:"collation"`
	Username    string `json:"username"`
	Password    string `json:"password"`
	Permission  string `json:"permission" validate:"required"`
	Description string `json:"description"`
}

type MysqlUser struct {
	Username    string `json:"username"`
	Host        string `json:"host"`
	Password    string `json:"password"`
	Description string `json:"description"`
	IsDelete    bool   `json:"isDelete"`
}

type MysqlGrant struct {
	Database string `json:"database"`
	Username string `json:"username"`
	Host     string `json:"host"`
}

type MysqlGrantSummarySearch struct {
	Database string   `json:"database" validate:"required"`
	DBs      []string `json:"dbs" validate:"required"`
}

type MysqlUserSearch struct {
	Database string `json:"database" validate:"required"`
}

type MysqlUserCreate struct {
	Database    string   `json:"database" validate:"required"`
	Username    string   `json:"username" validate:"required"`
	Password    string   `json:"password" validate:"required"`
	Host        string   `json:"host" validate:"required"`
	Description string   `json:"description"`
	DBs         []string `json:"dbs"`
}

type MysqlUserDelete struct {
	Database string `json:"database" validate:"required"`
	Username string `json:"username" validate:"required"`
	Host     string `json:"host" validate:"required"`
}

type MysqlUserUpdate struct {
	Database    string `json:"database" validate:"required"`
	Username    string `json:"username" validate:"required"`
	Host        string `json:"host" validate:"required"`
	NewHost     string `json:"newHost" validate:"required"`
	Description string `json:"description"`
}

type MysqlUserPassword struct {
	Database string `json:"database" validate:"required"`
	Username string `json:"username" validate:"required"`
	Host     string `json:"host" validate:"required"`
	Password string `json:"password" validate:"required"`
}

type MysqlGrantCreate struct {
	Database string `json:"database" validate:"required"`
	DB       string `json:"db" validate:"required"`
	Username string `json:"username" validate:"required"`
	Host     string `json:"host" validate:"required"`
}

type MysqlGrantDelete struct {
	Database string `json:"database" validate:"required"`
	DB       string `json:"db" validate:"required"`
	Username string `json:"username" validate:"required"`
	Host     string `json:"host" validate:"required"`
}

type MysqlFormatCollationOption struct {
	Format     string   `json:"format"`
	Collations []string `json:"collations"`
}

type MysqlLoadDB struct {
	From     string `json:"from" validate:"required,oneof=local remote"`
	Type     string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
	Database string `json:"database" validate:"required"`
}

type MysqlDBDeleteCheck struct {
	ID       uint   `json:"id" validate:"required"`
	Type     string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
	Database string `json:"database" validate:"required"`
}

type MysqlDBDelete struct {
	ID           uint   `json:"id" validate:"required"`
	Type         string `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
	Database     string `json:"database" validate:"required"`
	ForceDelete  bool   `json:"forceDelete"`
	DeleteBackup bool   `json:"deleteBackup"`
}

type MysqlStatus struct {
	AbortedClients               string `json:"Aborted_clients"`
	AbortedConnects              string `json:"Aborted_connects"`
	BytesReceived                string `json:"Bytes_received"`
	BytesSent                    string `json:"Bytes_sent"`
	ComCommit                    string `json:"Com_commit"`
	ComRollback                  string `json:"Com_rollback"`
	Connections                  string `json:"Connections"`
	CreatedTmpDiskTables         string `json:"Created_tmp_disk_tables"`
	CreatedTmpTables             string `json:"Created_tmp_tables"`
	InnodbBufferPoolPagesDirty   string `json:"Innodb_buffer_pool_pages_dirty"`
	InnodbBufferPoolReadRequests string `json:"Innodb_buffer_pool_read_requests"`
	InnodbBufferPoolReads        string `json:"Innodb_buffer_pool_reads"`
	KeyReadRequests              string `json:"Key_read_requests"`
	KeyReads                     string `json:"Key_reads"`
	KeyWriteEequests             string `json:"Key_write_requests"`
	KeyWrites                    string `json:"Key_writes"`
	MaxUsedConnections           string `json:"Max_used_connections"`
	OpenTables                   string `json:"Open_tables"`
	OpenedFiles                  string `json:"Opened_files"`
	OpenedTables                 string `json:"Opened_tables"`
	QcacheHits                   string `json:"Qcache_hits"`
	QcacheInserts                string `json:"Qcache_inserts"`
	Questions                    string `json:"Questions"`
	SelectFullJoin               string `json:"Select_full_join"`
	SelectRangeCheck             string `json:"Select_range_check"`
	SortMergePasses              string `json:"Sort_merge_passes"`
	TableLocksWaited             string `json:"Table_locks_waited"`
	ThreadsCached                string `json:"Threads_cached"`
	ThreadsConnected             string `json:"Threads_connected"`
	ThreadsCreated               string `json:"Threads_created"`
	ThreadsRunning               string `json:"Threads_running"`
	Uptime                       string `json:"Uptime"`
	Run                          string `json:"Run"`
	File                         string `json:"File"`
	Position                     string `json:"Position"`
}

// mongodb
type MongodbDBSearch struct {
	PageInfo
	Info     string `json:"info"`
	Database string `json:"database" validate:"required"`
	OrderBy  string `json:"orderBy" validate:"required,oneof=name createdAt"`
	Order    string `json:"order" validate:"required,oneof=null ascending descending"`
}

type MongodbDBInfo struct {
	ID          uint      `json:"id"`
	CreatedAt   time.Time `json:"createdAt"`
	Name        string    `json:"name"`
	From        string    `json:"from"`
	MongodbName string    `json:"mongodbName"`
	Username    string    `json:"username"`
	Password    string    `json:"password"`
	IsDelete    bool      `json:"isDelete"`
	Description string    `json:"description"`
}

type MongodbDBCreate struct {
	Name        string `json:"name" validate:"required"`
	From        string `json:"from" validate:"required,oneof=local remote"`
	Database    string `json:"database" validate:"required"`
	Username    string `json:"username" validate:"required"`
	Password    string `json:"password" validate:"required"`
	Permission  string `json:"permission" validate:"required,oneof=dbOwner read readWrite userAdmin"`
	Description string `json:"description"`
}

type MongodbLoadDB struct {
	From     string `json:"from" validate:"required,oneof=local remote"`
	Type     string `json:"type" validate:"required,oneof=mongodb"`
	Database string `json:"database" validate:"required"`
}

type MongodbDBDeleteCheck struct {
	ID       uint   `json:"id" validate:"required"`
	Type     string `json:"type" validate:"required,oneof=mongodb"`
	Database string `json:"database" validate:"required"`
}

type MongodbDBDelete struct {
	ID           uint   `json:"id" validate:"required"`
	Type         string `json:"type" validate:"required,oneof=mongodb"`
	Database     string `json:"database" validate:"required"`
	ForceDelete  bool   `json:"forceDelete"`
	DeleteBackup bool   `json:"deleteBackup"`
}

type MongodbBind struct {
	Database string `json:"database" validate:"required"`
	Name     string `json:"name" validate:"required"`
	Username string `json:"username" validate:"required"`
	Password string `json:"password" validate:"required"`
}

type MongodbPassword struct {
	Database string `json:"database" validate:"required"`
	Name     string `json:"name" validate:"required"`
	Password string `json:"password" validate:"required"`
}

type MongodbPrivileges struct {
	Database   string `json:"database" validate:"required"`
	Name       string `json:"name" validate:"required"`
	Username   string `json:"username" validate:"required"`
	Permission string `json:"permission" validate:"required,oneof=dbOwner read readWrite userAdmin"`
}

type MongodbPrivilegesLoad struct {
	Database string `json:"database" validate:"required"`
	Name     string `json:"name" validate:"required"`
	Username string `json:"username" validate:"required"`
}

type MysqlVariables struct {
	BinlogCacheSize      string `json:"binlog_cache_size"`
	InnodbBufferPoolSize string `json:"innodb_buffer_pool_size"`
	InnodbLogBufferSize  string `json:"innodb_log_buffer_size"`
	JoinBufferSize       string `json:"join_buffer_size"`
	KeyBufferSize        string `json:"key_buffer_size"`
	MaxConnections       string `json:"max_connections"`
	MaxHeapTableSize     string `json:"max_heap_table_size"`
	QueryCacheSize       string `json:"query_cache_size"`
	QueryCacheType       string `json:"query_cache_type"`
	ReadBufferSize       string `json:"read_buffer_size"`
	ReadRndBufferSize    string `json:"read_rnd_buffer_size"`
	SortBufferSize       string `json:"sort_buffer_size"`
	TableOpenCache       string `json:"table_open_cache"`
	ThreadCacheSize      string `json:"thread_cache_size"`
	ThreadStack          string `json:"thread_stack"`
	TmpTableSize         string `json:"tmp_table_size"`

	SlowQueryLog  string `json:"slow_query_log"`
	LongQueryTime string `json:"long_query_time"`
}

type MysqlVariablesUpdate struct {
	Type      string                       `json:"type" validate:"required,oneof=mysql mariadb mysql-cluster"`
	Database  string                       `json:"database" validate:"required"`
	Variables []MysqlVariablesUpdateHelper `json:"variables"`
}

type MysqlVariablesUpdateHelper struct {
	Param string      `json:"param"`
	Value interface{} `json:"value"`
}

// redis
type ChangeRedisPass struct {
	Database string `json:"database" validate:"required"`
	Value    string `json:"value"`
}

type RedisConfUpdate struct {
	Database   string `json:"database" validate:"required"`
	Timeout    string `json:"timeout"`
	Maxclients string `json:"maxclients"`
	Maxmemory  string `json:"maxmemory"`
	DBType     string `json:"dbType" validate:"required,oneof=redis redis-cluster"`
}
type RedisConfPersistenceUpdate struct {
	Database    string `json:"database" validate:"required"`
	Type        string `json:"type" validate:"required,oneof=aof rbd"`
	Appendonly  string `json:"appendonly"`
	Appendfsync string `json:"appendfsync"`
	Save        string `json:"save"`
	DBType      string `json:"dbType" validate:"required,oneof=redis redis-cluster"`
}

type RedisConf struct {
	Database      string `json:"database" validate:"required"`
	Name          string `json:"name"`
	Port          int64  `json:"port"`
	ContainerName string `json:"containerName"`
	Timeout       string `json:"timeout"`
	Maxclients    string `json:"maxclients"`
	Requirepass   string `json:"requirepass"`
	Maxmemory     string `json:"maxmemory"`
}

type RedisPersistence struct {
	Database    string `json:"database" validate:"required"`
	Appendonly  string `json:"appendonly"`
	Appendfsync string `json:"appendfsync"`
	Save        string `json:"save"`
}

type RedisStatus struct {
	Database                 string `json:"database" validate:"required"`
	TcpPort                  string `json:"tcp_port"`
	UptimeInDays             string `json:"uptime_in_days"`
	ConnectedClients         string `json:"connected_clients"`
	UsedMemory               string `json:"used_memory"`
	UsedMemoryRss            string `json:"used_memory_rss"`
	UsedMemoryPeak           string `json:"used_memory_peak"`
	MemFragmentationRatio    string `json:"mem_fragmentation_ratio"`
	TotalConnectionsReceived string `json:"total_connections_received"`
	TotalCommandsProcessed   string `json:"total_commands_processed"`
	InstantaneousOpsPerSec   string `json:"instantaneous_ops_per_sec"`
	KeyspaceHits             string `json:"keyspace_hits"`
	KeyspaceMisses           string `json:"keyspace_misses"`
	LatestForkUsec           string `json:"latest_fork_usec"`
}

type DatabaseFileRecords struct {
	Database  string `json:"database" validate:"required"`
	FileName  string `json:"fileName"`
	FileDir   string `json:"fileDir"`
	CreatedAt string `json:"createdAt"`
	Size      int    `json:"size"`
}
type RedisBackupRecover struct {
	Database string `json:"database" validate:"required"`
	FileName string `json:"fileName"`
	FileDir  string `json:"fileDir"`
}

// database
type DatabaseSearch struct {
	PageInfo
	Info    string `json:"info"`
	Type    string `json:"type"`
	OrderBy string `json:"orderBy" validate:"required,oneof=name createdAt"`
	Order   string `json:"order" validate:"required,oneof=null ascending descending"`
}

type DatabaseInfo struct {
	ID        uint      `json:"id"`
	CreatedAt time.Time `json:"createdAt"`
	Name      string    `json:"name" validate:"max=256"`
	From      string    `json:"from"`
	Type      string    `json:"type"`
	Version   string    `json:"version"`
	Address   string    `json:"address"`
	Port      uint      `json:"port"`
	InitialDB string    `json:"initialDB"`
	Username  string    `json:"username"`
	Password  string    `json:"password"`

	SSL        bool   `json:"ssl"`
	RootCert   string `json:"rootCert"`
	ClientKey  string `json:"clientKey"`
	ClientCert string `json:"clientCert"`
	SkipVerify bool   `json:"skipVerify"`

	Timeout     uint   `json:"timeout"`
	Description string `json:"description"`
}

type DatabaseOption struct {
	ID       uint   `json:"id"`
	Type     string `json:"type"`
	From     string `json:"from"`
	Database string `json:"database"`
	Version  string `json:"version"`
	Address  string `json:"address"`
}

type DatabaseItem struct {
	ID       uint   `json:"id"`
	From     string `json:"from"`
	Database string `json:"database"`
	Name     string `json:"name"`
}

type DatabaseCreate struct {
	Name      string `json:"name" validate:"required,max=256"`
	Type      string `json:"type" validate:"required"`
	From      string `json:"from" validate:"required,oneof=local remote"`
	Version   string `json:"version" validate:"required"`
	Address   string `json:"address"`
	Port      uint   `json:"port"`
	InitialDB string `json:"initialDB"`
	Username  string `json:"username" validate:"required"`
	Password  string `json:"password"`

	SSL        bool   `json:"ssl"`
	RootCert   string `json:"rootCert"`
	ClientKey  string `json:"clientKey"`
	ClientCert string `json:"clientCert"`
	SkipVerify bool   `json:"skipVerify"`

	Timeout     uint   `json:"timeout"`
	Description string `json:"description"`
}

type DatabaseUpdate struct {
	ID        uint   `json:"id"`
	Type      string `json:"type" validate:"required"`
	Version   string `json:"version" validate:"required"`
	Address   string `json:"address"`
	Port      uint   `json:"port"`
	InitialDB string `json:"initialDB"`
	Username  string `json:"username" validate:"required"`
	Password  string `json:"password"`

	SSL        bool   `json:"ssl"`
	RootCert   string `json:"rootCert"`
	ClientKey  string `json:"clientKey"`
	ClientCert string `json:"clientCert"`
	SkipVerify bool   `json:"skipVerify"`

	Timeout     uint   `json:"timeout"`
	Description string `json:"description"`
}

type DatabaseDelete struct {
	ID           uint `json:"id" validate:"required"`
	ForceDelete  bool `json:"forceDelete"`
	DeleteBackup bool `json:"deleteBackup"`
}

type LoadRedisStatus struct {
	Name string `json:"name" validate:"required"`
	Type string `json:"type" validate:"required"`
}

type DBResource struct {
	Type string `json:"type"`
	Name string `json:"name"`
}
