package entity

import "time"

// @Time    : 2022/11/14 11:32 AM
// @Author  : lvhongmeng

type SQLEditorSettings struct {
	ID            uint64    `json:"id"`
	CreatedBy     string    `json:"created_by"`
	OrgID         uint64    `json:"org_id"`
	ProjectID     uint64    `json:"project_id"`
	ClusterID     uint64    `json:"cluster_id"`
	BasicSettings string    `json:"basic_settings"`
	CreatedAt     time.Time `json:"created_at"`
	UpdatedAt     time.Time `json:"updated_at"`
}

type UserInfo struct {
	ID               uint64 `json:"id"`
	CreatedBy        string `json:"created_by"`
	Chat2queryInit   bool   `json:"chat2query_init"`
	PrivacyBoxCount  int    `json:"privacy_box_count"`
	IsPrivacyAllowed bool   `json:"is_privacy_allowed"`
}

type UserInfoParam struct {
	Chat2queryInit   bool `json:"chat2query_init"`
	PrivacyBoxCount  int  `json:"privacy_box_count"`
	IsPrivacyAllowed bool `json:"is_privacy_allowed"`
}

type StatementParam struct {
	SessionId     string `json:"sessionid" binding:"required"`
	Chat2QuerySid string `json:"chat2query_sid"`
	Sql           string `json:"sql"`
	Database      string `json:"database"`
	SqlFileID     int64  `json:"sql_file_id"`
}

type ShowClusterMetaParam struct {
	IsBrief int `json:"isbrief"`
}

type SessionParam struct {
	Database string `json:"database"`
}

type MultiStatementParam struct {
	Statements []*MultiStatements `json:"statements"`
	Database   string             `json:"database"`
}

type MultiStatements struct {
	SqlId string `json:"sql_id"`
	Sql   string `json:"sql"`
}

type DataRes struct {
	Columns      []*Columns `json:"columns"`
	Rows         [][]string `json:"rows"`
	StartTime    string     `json:"start_time"`
	EndTime      string     `json:"end_time"`
	StartTimeMS  int64      `json:"start_time_ms"`
	EndTimeMS    int64      `json:"end_time_ms"`
	ExecuteTime  string     `json:"execute_time"`
	RowCount     int64      `json:"row_count"`
	Limit        int        `json:"limit"`
	Query        string     `json:"query"`
	Databases    []string   `json:"databases"`
	WarnCount    int        `json:"warn_count"`
	WarnMessages []string   `json:"warn_messages"`
}

type DataResOther struct {
	Rows        string `json:"rows"`
	ExecuteTime string `json:"execute_time"`
}

type Columns struct {
	Col      string `json:"col"`
	DataType string `json:"data_type"`
	Nullable bool   `json:"nullable"`
}

type SqlEditorMessage struct {
	ID           uint64    `json:"id"`
	OrgId        uint64    `json:"org_id"`
	ProjectId    uint64    `json:"project_id"`
	ClusterId    uint64    `json:"cluster_id"`
	SessionId    string    `json:"session_id"`
	Sql          string    `json:"sql"`
	StartTime    string    `json:"start_time"`
	EndTime      string    `json:"end_time"`
	Status       string    `json:"status"`
	ErrorMessage string    `json:"error_message"`
	Duration     string    `json:"duration"`
	CreatedBy    string    `json:"created_by"`
	CreatedAt    time.Time `json:"created_at"`
	UpdatedAt    time.Time `json:"updated_at"`
	Loki         string    `json:"loki"`
}

type MetaRes struct {
	ClusterId uint64     `json:"clusterid"`
	Database  string     `json:"database"`
	Table     string     `json:"table"`
	Columns   []*Columns `json:"columns"`
}

type SqlEditorFile struct {
	ID        uint64    `json:"id"`
	OrgId     uint64    `json:"org_id"`
	ProjectId uint64    `json:"project_id"`
	ClusterId uint64    `json:"cluster_id"`
	Database  string    `json:"database"`
	Name      string    `json:"name"`
	Content   string    `json:"content"`
	IsDeleted int       `json:"is_deleted"`
	CreatedBy string    `json:"created_by"`
	UpdatedBy string    `json:"updated_by"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

type SQLFileReq struct {
	Database string `json:"database"`
	Name     string `json:"name"`
	Content  string `json:"content"`
}

type DBMeta struct {
	Name   string        `json:"name"`
	Tables []*TablesMeta `json:"tables"`
}

type TablesMeta struct {
	Name    string     `json:"name"`
	Columns []*Columns `json:"columns"`
}

type CreateSessionInput struct {
	CreatedBy  string
	Projectid  uint64
	Clusterid  uint64
	Database   string
	Auth0Token string
}

type SqlExecInput struct {
	CreatedBy  string
	Projectid  uint64
	Clusterid  uint64
	DbName     string
	TableName  string
	Auth0Token string
}

type ShowClusterMetaInput struct {
	CreatedBy  string
	Projectid  uint64
	Clusterid  uint64
	IsBrief    string
	Auth0Token string
}

type IsDBTableExist struct {
	IsExist   bool   `json:"is_exist"`
	SessionId string `json:"session_id"`
}

type DataAppSettingsFormat struct {
	EnableDataAPI bool `json:"enable_dataapi"`
}

type DataAppSettings struct {
	OrgID         uint64    `json:"org_id"`
	ProjectID     uint64    `json:"project_id"`
	DataappId     uint64    `json:"dataapp_id"`
	ExternalAppId string    `json:"external_app_id"`
	EnableDataAPI bool      `json:"enable_dataapi"`
	CreatedBy     string    `json:"created_by"`
	UpdatedBy     string    `json:"updated_by"`
	CreatedAt     time.Time `json:"created_at"`
	UpdatedAt     time.Time `json:"updated_at"`
}

type Settings struct {
	Limit              int  `json:"limit"`
	ShowSystemDbSchema bool `json:"show_system_db_schema"`
	EnableDataAPI      bool `json:"enable_dataapi"`
}

type EventType string

const (
	EventTypeGenSql    EventType = "gen_sql"
	EventTypeSqlAccept EventType = "sql_accept"
	EventTypeExecSql   EventType = "exec_sql"
)

var ValidEventType = map[EventType]bool{
	EventTypeGenSql:    true,
	EventTypeSqlAccept: true,
	EventTypeExecSql:   true,
}

type SqlEditorOplogParam struct {
	SessionId     string    `json:"session_id" binding:"required"`
	Chat2QuerySId string    `json:"chat2query_sid"`
	SqlFileId     int64     `json:"sql_file_id" binding:"required"`
	EventType     EventType `json:"event_type" binding:"required"`
	UserQuestion  string    `json:"user_question"`
	SqlContent    string    `json:"sql_content"`
	IsAccept      bool      `json:"is_accept"`
	IsModified    bool      `json:"is_modified"`
	StartTime     int64     `json:"start_time"`
	EndTime       int64     `json:"end_time"`
	AffectedRows  int64     `json:"affected_rows"`
	Status        int8      `json:"status"`
	ErrorMessage  string    `json:"error_message"`
	PromptVersion string    `json:"prompt_version"`
}

type InnerSqlEditorOplogParam struct {
	OrgID     uint64 `json:"org_id" binding:"required"`
	ProjectID uint64 `json:"project_id" binding:"required"`
	ClusterID uint64 `json:"cluster_id" binding:"required"`
	CreatedBy string `json:"created_by,omitempty"`
	Databases string `json:"databases,omitempty"`
	Channel   string `json:"channel,omitempty"`

	Chat2QuerySId   string    `json:"chat2query_sid"`
	EventType       EventType `json:"event_type" binding:"required"`
	UserQuestion    string    `json:"user_question"`
	SqlContent      string    `json:"sql_content"`
	IsAccept        bool      `json:"is_accept"`
	StartTime       string    `json:"start_time"`
	EndTime         string    `json:"end_time"`
	Duration        int64     `json:"duration"`
	AffectedRows    int64     `json:"affected_rows"`
	AffectedColumns int64     `json:"affected_columns"`
	Status          int8      `json:"status"`
	ErrorMessage    string    `json:"error_message"`
	PromptVersion   string    `json:"prompt_version"`
}

type SqlEditorOplog struct {
	ID              uint64    `json:"id"`
	OrgId           uint64    `json:"org_id"`
	ProjectId       uint64    `json:"project_id"`
	ClusterId       uint64    `json:"cluster_id"`
	SessionId       string    `json:"session_id"`
	Chat2QuerySId   string    `gorm:"column:chat2query_sid" json:"chat2query_sid"`
	SqlFileId       int64     `json:"sql_file_id"`
	EventType       string    `json:"event_type"`
	UserQuestion    string    `json:"user_question"`
	SqlContent      string    `json:"sql_content"`
	IsAccept        bool      `json:"is_accept"`
	IsModified      bool      `json:"is_modified"`
	StartTime       string    `json:"start_time"`
	EndTime         string    `json:"end_time"`
	Duration        int64     `json:"duration"`
	AffectedRows    int64     `json:"affected_rows"`
	AffectedColumns int64     `json:"affected_columns"`
	Status          int8      `json:"status"`
	ErrorMessage    string    `json:"error_message"`
	CreatedBy       string    `json:"created_by"`
	CreatedAt       time.Time `json:"created_at"`
	PromptVersion   string    `json:"prompt_version"`
	Databases       string    `json:"databases"`
	Channel         string    `json:"channel"`
}

type IsDBTableExistInput struct {
	CreatedBy  string
	ProjectId  uint64
	ClusterId  uint64
	DbName     string
	TableName  string
	Auth0Token string
}
