package fastgpt

import (
	"errors"
)

type SearchReq struct {
	DatasetID   string  `json:"datasetId"`           //知识库ID
	Text        string  `json:"text"`                //需要测试的文本
	Limit       uint64  `json:"limit"`               //最大 tokens 数量
	Similarity  float64 `json:"similarity,optional"` //最低相关度(0~1,可选)
	SearchMode  string  `json:"searchMode"`          //搜索模式:embedding | fullTextRecall | mixedRecall
	UsingReRank bool    `json:"usingReRank"`         //使用重排
}

type SearchResp struct {
	Code       int    `json:"code"`
	StatusText string `json:"statusText"`
	Message    string `json:"message"`
	Data       struct {
		List []struct {
			ID           string `json:"id"`
			DatasetID    string `json:"datasetId"`
			CollectionID string `json:"collectionId"`
			SourceName   string `json:"sourceName"`
			Q            string `json:"q"`
			A            string `json:"a"`
			ChunkIndex   int    `json:"chunkIndex"`
			Score        []struct {
				Type  string  `json:"type"`
				Value float64 `json:"value"`
				Index uint64  `json:"index"`
			} `json:"score"`
		} `json:"list,optional"`
		Duration              string `json:"duration"`
		SearchMode            string `json:"searchMode"`
		Limit                 uint64 `json:"limit"`
		Similarity            uint64 `json:"similarity"`
		UsingReRank           bool   `json:"usingReRank"`
		UsingSimilarityFilter bool   `json:"usingSimilarityFilter"`
	} `json:"data,optional"`
}

// SearchText 搜索数据
func SearchText(params *SearchReq) (dataList *SearchResp, err error) {
	resp, err := NewResty().
		R().
		SetResult(&dataList).
		SetBody(params).
		Post("core/dataset/searchTest")

	if err != nil {
		return nil, err
	}

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

	return
}