package fastgpt

import (
	"errors"
	"time"
)

type DatasetResp struct {
	Code       int    `json:"code"`
	StatusText string `json:"statusText"`
	Message    string `json:"message"`
	Data       string `json:"data"`
}

type DatasetReq struct {
	ParentID    string `json:"parentId,optional"`
	Type        string `json:"type,optional"`
	Avatar      string `json:"avatar,optional"`
	Name        string `json:"name"`
	Intro       string `json:"intro,optional"`
	VectorModel string `json:"vectorModel"`
	AgentModel  string `json:"agentModel"`
}

type DatasetInfo struct {
	ID          string `json:"_id"`
	ParentID    string `json:"parentId,optional"`
	TeamID      string `json:"teamId,optional"`
	TmbID       string `json:"tmbId,optional"`
	Type        string `json:"type,optional"`
	Status      string `json:"status,optional"`
	Avatar      string `json:"avatar,optional"`
	Name        string `json:"name,optional"`
	VectorModel struct {
		Model            string `json:"model"`
		Name             string `json:"name"`
		Avatar           string `json:"avatar"`
		CharsPointsPrice uint64 `json:"charsPointsPrice"`
		DefaultToken     uint64 `json:"defaultToken"`
		MaxToken         uint64 `json:"maxToken"`
		Weight           uint64 `json:"weight"`
		DefaultConfig    struct {
		} `json:"defaultConfig"`
		DbConfig struct {
		} `json:"dbConfig"`
		QueryConfig struct {
		} `json:"queryConfig"`
	} `json:"vectorModel,optional"`
	AgentModel struct {
		Model                   string  `json:"model"`
		Name                    string  `json:"name"`
		Avatar                  string  `json:"avatar"`
		MaxContext              uint64  `json:"maxContext"`
		MaxResponse             uint64  `json:"maxResponse"`
		QuoteMaxToken           uint64  `json:"quoteMaxToken"`
		MaxTemperature          float64 `json:"maxTemperature"`
		CharsPointsPrice        uint64  `json:"charsPointsPrice"`
		Censor                  bool    `json:"censor"`
		Vision                  bool    `json:"vision"`
		DatasetProcess          bool    `json:"datasetProcess"`
		UsedInClassify          bool    `json:"usedInClassify"`
		UsedInExtractFields     bool    `json:"usedInExtractFields"`
		UsedInToolCall          bool    `json:"usedInToolCall"`
		UsedInQueryExtension    bool    `json:"usedInQueryExtension"`
		ToolChoice              bool    `json:"toolChoice"`
		FunctionCall            bool    `json:"functionCall"`
		CustomCQPrompt          string  `json:"customCQPrompt"`
		CustomExtractPrompt     string  `json:"customExtractPrompt"`
		DefaultSystemChatPrompt string  `json:"defaultSystemChatPrompt"`
		DefaultConfig           struct {
		} `json:"defaultConfig"`
	} `json:"agentModel,optional"`
	Intro      string `json:"intro,optional"`
	Permission struct {
		Value        int64 `json:"value"`
		IsOwner      bool  `json:"isOwner"`
		HasManagePer bool  `json:"hasManagePer"`
		HasWritePer  bool  `json:"hasWritePer"`
		HasReadPer   bool  `json:"hasReadPer"`
	} `json:"permission,optional"`
	DefaultPermission uint64    `json:"defaultPermission.optional"`
	UpdateTime        time.Time `json:"updateTime,optional"`
	V                 uint64    `json:"__v,optional"`
}

type DatasetList struct {
	Code       int           `json:"code"`
	StatusText string        `json:"statusText"`
	Message    string        `json:"message"`
	Data       []DatasetInfo `json:"data"`
}

type DatasetDetail struct {
	Code       int         `json:"code"`
	StatusText string      `json:"statusText"`
	Message    string      `json:"message"`
	Data       DatasetInfo `json:"data"`
}

// GetDatasetDetail 获取数据集详情
func GetDatasetDetail(id string) (dataset *DatasetDetail, err error) {
	resp, err := NewResty().
		R().
		SetResult(&dataset).
		SetQueryParam("id", id).
		Get("core/dataset/detail")

	if err != nil {
		return nil, err
	}

	if resp.IsError() {
		return nil, errors.New(resp.String())
	}
	return
}

// GetDatasetList 获取数据集列表
func GetDatasetList(parentId string) (datasetList *DatasetList, err error) {
	resp, err := NewResty().
		R().
		SetResult(&datasetList).
		SetBody(map[string]string{"parentId": parentId}).
		Post("core/dataset/list")

	if err != nil {
		return nil, err
	}

	if resp.IsError() {
		return nil, errors.New(resp.String())
	}

	return
}

// CreateDataset 创建数据集
func CreateDataset(data *DatasetReq) (dataset *DatasetResp, err error) {
	data.Type = "dataset"
	if data.Avatar == "" {
		data.Avatar = "/icon/logo.svg"
	}

	resp, err := NewResty().
		R().
		SetResult(&dataset).
		SetBody(*data).
		Post("core/dataset/create")

	if err != nil {
		return nil, err
	}

	if resp.IsError() {
		return nil, errors.New(resp.String())
	}

	return
}

// CreateDatasetFolder 创建数据集目录
func CreateDatasetFolder(data *DatasetReq) (*DatasetResp, error) {
	data.Type = "folder"
	data.Avatar = "/imgs/files/folder.svg"
	return CreateDataset(data)
}

// DeleteDataset 删除数据集
func DeleteDataset(id string) (dataset *DatasetResp, err error) {
	resp, err := NewResty().
		R().
		SetResult(&dataset).
		SetQueryParam("id", id).
		Delete("core/dataset/delete")

	if err != nil {
		return nil, err
	}

	if resp.IsError() {
		return nil, errors.New(resp.String())
	}

	return
}
