package dto

import entity "dataapps/internal/entity/sqleditor"

type QueryStreamResultReq struct {
	JobID   string `json:"job_id" form:"job_id"`
	BotType string `json:"bot_type" form:"bot_type"`
}

type QueryStreamResultResp struct {
	SQL       string              `json:"sql,omitempty"`
	Questions []Chat2QuestionResp `json:"questions,omitempty"`
	Columns   []ColumnDescription `json:"columns,omitempty"`
}

type Chat2QueryReq struct {
	ClusterID   uint64   `json:"cluster_id,string"`
	Database    string   `json:"database"`
	Instruction string   `json:"instruction"`
	QuestionNum int      `json:"question_num"`
	Tables      []string `json:"tables"`
	// only need to support single table
	SampleData []map[string]interface{} `json:"sample_data"`
	// support multiple table
	DatabaseSchema map[string][]ColumnDescription `json:"database_schema"`
	Async          bool                           `json:"async"`
}

type Chat2QueryParam struct {
	OrgID                 uint64   `json:"org_id"`
	ProjectID             uint64   `json:"project_id"`
	ClusterID             uint64   `json:"cluster_id"`
	Database              string   `json:"database"`
	Instruction           string   `json:"instruction"`
	Apikey                string   `json:"api_key"`
	PromptTemplate        string   `json:"prompt_template"`
	PromptTemplateVersion string   `json:"prompt_template_version"`
	ShowInternalInfo      bool     `json:"show_internal_info"`
	QuestionNum           int      `json:"question_num"`
	Chat2QuerySid         string   `json:"chat2query_sid"`
	Tables                []string `json:"tables"`
	SampleData            string   `json:"sample_data"`
	DatabaseSchema        string   `json:"database_schema"`
	Async                 bool     `json:"async"`
}

type Chat2QuestionResult struct {
	BasicRes

	Questions []Chat2QuestionResp `json:"questions"`
	CostTime  string              `json:"cost_time,omitempty"`
	JobID     string              `json:"job_id,omitempty"`
}

type ColumnDescription struct {
	Column      string `json:"column"`
	Type        string `json:"type"`
	Description string `json:"description"`
}

type Data2ColumnMatchingResult struct {
	BasicRes
	Columns  []ColumnDescription `json:"columns"`
	CostTime string              `json:"cost_time,omitempty"`
	JobID    string              `json:"job_id,omitempty"`
}

type Chat2QueryResult struct {
	BasicRes
	GenSQL         string            `json:"gen_sql,omitempty"`
	CallOpenAITime string            `json:"call_openai_time,omitempty"`
	StartTime      string            `json:"start_time,omitempty"`
	EndTime        string            `json:"end_time,omitempty"`
	ExecuteTime    string            `json:"execute_time,omitempty"`
	Query          string            `json:"query,omitempty"`
	RowCount       int64             `json:"row_count,omitempty"`
	Columns        []*entity.Columns `json:"columns,omitempty"`
	Rows           [][]string        `json:"rows,omitempty"`
	Limit          int               `json:"limit,omitempty"`
	ChartInfo      *ChartInfo        `json:"chart_info,omitempty"`
	CostTime       string            `json:"cost_time,omitempty"`
	TokenUsed      int               `json:"token_used,omitempty"`
	FullPrompt     string            `json:"full_prompt,omitempty"`
}

type Chat2QueryAuthInfo struct {
	ApiKey    string `json:"api_key"`
	AppID     string `json:"app_id"`
	OrgID     uint64 `json:"org_id"`
	ProjectID uint64 `json:"project_id"`
}

type ChartInfo struct {
	ChartName string                 `json:"chartName"`
	Title     string                 `json:"title"`
	Options   map[string]interface{} `json:"options"`
}

type Chat2ChartInfo struct {
	Sql       string    `json:"sql"`
	ChartInfo ChartInfo `json:"chart"`
	Questions []string  `json:"questions"`
}

type Chat2QuestionResp struct {
	QuestionID      int    `json:"question_id"`
	Question        string `json:"question"`
	QuestionKeyword string `json:"question_keyword"`
}

type InteractRequest struct {
	SqlFileID             int64    `json:"sql_file_id"`
	SessionID             string   `json:"session_id"`
	Question              string   `json:"question"`
	BotType               string   `json:"bot_type"`
	OrgID                 uint64   `json:"-"`
	ProjectID             uint64   `json:"-"`
	ClusterID             string   `json:"cluster_id,omitempty"`
	Database              string   `json:"database,omitempty"`
	PromptTemplate        string   `json:"prompt_template"`
	PromptTemplateVersion string   `json:"prompt_template_version"`
	QuestionNum           int      `json:"question_num"`
	Tables                []string `json:"tables"`
	SampleData            string   `json:"sample_data"`
	DatabaseSchema        string   `json:"database_schema"`
	Async                 bool     `json:"async"`
}

type InteractResponse struct {
	SessionID     string `json:"session_id"`
	Question      string `json:"question"`
	Prompt        string `json:"prompt"`
	Response      string `json:"response"`
	Code          int    `json:"code"`
	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"`
	PromptVersion string `json:"prompt_version"`
	TokenUsed     int32  `json:"token_used"`
	Database      string `json:"database"`
	JobID         string `json:"job_id"`
}
