package llm

import (
	"encoding/json"
	"eta/eta_api/cache"
	"eta/eta_api/controllers"
	"eta/eta_api/models"
	"eta/eta_api/models/rag"
	"eta/eta_api/models/rag/request"
	"eta/eta_api/models/rag/response"
	"eta/eta_api/services"
	"eta/eta_api/services/elastic"
	"eta/eta_api/utils"
	"fmt"
	"github.com/rdlucklib/rdluck_tools/paging"
	"strconv"
	"strings"
)

// AbstractController
// @Description: 摘要管理
type AbstractController struct {
	controllers.BaseAuthController
}

// List
// @Title 列表
// @Description 列表
// @Param   PageSize   query   int  true       "每页数据条数"
// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
// @Param   KeyWord   query   string  true       "搜索关键词"
// @Success 200 {object} []*rag.QuestionListListResp
// @router /abstract/list [get]
func (c *AbstractController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()

	sysUser := c.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录,SysUser Is Empty"
		return
	}
	pageSize, _ := c.GetInt("PageSize")
	currentIndex, _ := c.GetInt("CurrentIndex")
	keyWord := c.GetString("KeyWord")
	tagIdStr := c.GetString("TagId")
	questionId, _ := c.GetInt("QuestionId")

	tagIdList := make([]int, 0)
	if tagIdStr != `` {
		tagIdStrList := strings.Split(tagIdStr, `,`)
		for _, v := range tagIdStrList {
			if v == `0` {
				continue
			}

			tagId, tmpErr := strconv.Atoi(v)
			if tmpErr != nil {
				br.Msg = "标签ID有误"
				br.ErrMsg = fmt.Sprintf("标签ID有误, %s", v)
				return
			}
			tagIdList = append(tagIdList, tagId)
		}
	}

	var startSize int
	if pageSize <= 0 {
		pageSize = utils.PageSize20
	}
	if currentIndex <= 0 {
		currentIndex = 1
	}
	startSize = utils.StartIndex(currentIndex, pageSize)

	// 获取列表
	total, viewList, err := getAbstractList(keyWord, tagIdList, questionId, startSize, pageSize)
	if err != nil {
		br.Msg = "获取失败"
		br.ErrMsg = "获取失败,Err:" + err.Error()
		return
	}

	page := paging.GetPaging(currentIndex, pageSize, total)
	resp := response.AbstractListListResp{
		List:   viewList,
		Paging: page,
	}

	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

func getAbstractList(keyWord string, tagList []int, questionId int, startSize, pageSize int) (total int, viewList []rag.WechatArticleAbstractView, err error) {
	//if keyWord == `` {
	//	var condition string
	//	var pars []interface{}
	//	condition += fmt.Sprintf(` AND c.%s = ?`, rag.WechatPlatformColumns.Enabled)
	//	pars = append(pars, 1)
	//
	//	if keyWord != "" {
	//		condition += fmt.Sprintf(` AND a.%s like ?`, rag.WechatArticleAbstractColumns.Content)
	//		pars = append(pars, `%`+keyWord+`%`)
	//	}
	//
	//	if tagId > 0 {
	//		condition += fmt.Sprintf(` AND d.%s = ?`, rag.WechatPlatformTagMappingColumns.TagID)
	//		pars = append(pars, tagId)
	//	}
	//
	//	obj := new(rag.WechatArticleAbstract)
	//	tmpTotal, list, tmpErr := obj.GetPageListByTagAndPlatformCondition(condition, pars, startSize, pageSize)
	//	if tmpErr != nil {
	//		err = tmpErr
	//		return
	//	}
	//	total = tmpTotal
	//	viewList = obj.WechatArticleAbstractItem(list)
	//} else {
	//	sortMap := map[string]string{
	//		//"ModifyTime":              "desc",
	//		//"WechatArticleAbstractId": "desc",
	//	}
	//
	//	obj := new(rag.WechatPlatform)
	//	platformList, tmpErr := obj.GetListByCondition(` AND enabled = 1 `, []interface{}{}, 0, 100000)
	//	if tmpErr != nil {
	//		err = tmpErr
	//		return
	//	}
	//	platformIdList := make([]int, 0)
	//	for _, v := range platformList {
	//		platformIdList = append(platformIdList, v.WechatPlatformId)
	//	}
	//	tagList := make([]int, 0)
	//	if tagId > 0 {
	//		tagList = append(tagList, tagId)
	//	}
	//	tmpTotal, list, tmpErr := elastic.WechatArticleAbstractEsSearch(keyWord, tagList, platformIdList, startSize, pageSize, sortMap)
	//	if tmpErr != nil {
	//		err = tmpErr
	//		return
	//	}
	//	total = int(tmpTotal)
	//	if list != nil && len(list) > 0 {
	//		viewList = list[0].ToViewList(list)
	//	}
	//}

	sortMap := map[string]string{
		//"ModifyTime":              "desc",
		//"WechatArticleAbstractId": "desc",
	}

	obj := new(rag.WechatPlatform)
	platformList, tmpErr := obj.GetListByCondition(` AND enabled = 1 `, []interface{}{}, 0, 100000)
	if tmpErr != nil {
		err = tmpErr
		return
	}
	platformIdList := make([]int, 0)
	for _, v := range platformList {
		platformIdList = append(platformIdList, v.WechatPlatformId)
	}
	tmpTotal, list, tmpErr := elastic.WechatArticleAbstractEsSearch(keyWord, tagList, platformIdList, questionId, startSize, pageSize, sortMap)
	if tmpErr != nil {
		err = tmpErr
		return
	}
	total = int(tmpTotal)
	if list != nil && len(list) > 0 {
		viewList = list[0].ToViewList(list)
	}

	return
}

// Del
// @Title 删除摘要
// @Description 删除摘要
// @Param	request	body request.BeachOpAbstractReq true "type json string"
// @Success 200 Ret=200 新增成功
// @router /abstract/del [post]
func (c *AbstractController) Del() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.BeachOpAbstractReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if len(req.WechatArticleAbstractIdList) <= 0 && !req.IsSelectAll {
		br.Msg = "请选择摘要"
		br.IsSendEmail = false
		return
	}

	vectorKeyList := make([]string, 0)
	wechatArticleAbstractIdList := make([]int, 0)

	obj := rag.WechatArticleAbstract{}

	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
		if utils.IsErrNoRow(err) {
			br.Msg = "问题不存在"
			br.IsSendEmail = false
		}
		return
	}
	if len(list) > 0 {
		for _, v := range list {
			// 有加入到向量库,那么就加入到待删除的向量库list中
			if v.VectorKey != `` {
				vectorKeyList = append(vectorKeyList, v.VectorKey)
			}
			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
		}
	}

	//if !req.IsSelectAll {
	//	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			// 有加入到向量库,那么就加入到待删除的向量库list中
	//			if v.VectorKey != `` {
	//				vectorKeyList = append(vectorKeyList, v.VectorKey)
	//			}
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//} else {
	//	notIdMap := make(map[int]bool)
	//	for _, v := range req.NotWechatArticleAbstractIdList {
	//		notIdMap[v] = true
	//	}
	//
	//	_, list, err := getAbstractList(req.KeyWord, req.TagId, 0, 100000)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			if notIdMap[v.WechatArticleAbstractId] {
	//				continue
	//			}
	//			// 有加入到向量库,那么就加入到待删除的向量库list中
	//			if v.VectorKey != `` {
	//				vectorKeyList = append(vectorKeyList, v.VectorKey)
	//			}
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//}

	// 删除向量库
	err = services.DelLlmDoc(vectorKeyList, wechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除向量库失败,Err:" + err.Error()
		return
	}

	// 删除摘要
	err = obj.DelByIdList(wechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除失败,Err:" + err.Error()
		return
	}

	// 删除es数据
	for _, wechatArticleAbstractId := range wechatArticleAbstractIdList {
		go services.DelEsWechatArticleAbstract(wechatArticleAbstractId)
	}

	br.Ret = 200
	br.Success = true
	br.Msg = `删除成功`
}

// VectorDel
// @Title 删除摘要向量库
// @Description 删除摘要向量库
// @Param	request	body request.BeachOpAbstractReq true "type json string"
// @Success 200 Ret=200 新增成功
// @router /abstract/vector/del [post]
func (c *AbstractController) VectorDel() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.BeachOpAbstractReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if len(req.WechatArticleAbstractIdList) <= 0 && !req.IsSelectAll {
		br.Msg = "请选择摘要"
		br.IsSendEmail = false
		return
	}

	vectorKeyList := make([]string, 0)
	wechatArticleAbstractIdList := make([]int, 0)

	obj := rag.WechatArticleAbstract{}
	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
		if utils.IsErrNoRow(err) {
			br.Msg = "问题不存在"
			br.IsSendEmail = false
		}
		return
	}
	if len(list) > 0 {
		for _, v := range list {
			// 有加入到向量库,那么就加入到待删除的向量库list中
			if v.VectorKey != `` {
				vectorKeyList = append(vectorKeyList, v.VectorKey)
			}
			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
		}
	}

	//if !req.IsSelectAll {
	//	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			// 有加入到向量库,那么就加入到待删除的向量库list中
	//			if v.VectorKey != `` {
	//				vectorKeyList = append(vectorKeyList, v.VectorKey)
	//			}
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//} else {
	//	notIdMap := make(map[int]bool)
	//	for _, v := range req.NotWechatArticleAbstractIdList {
	//		notIdMap[v] = true
	//	}
	//	_, list, err := getAbstractList(req.KeyWord, req.TagId, 0, 100000)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			if notIdMap[v.WechatArticleAbstractId] {
	//				continue
	//			}
	//
	//			// 有加入到向量库,那么就加入到待删除的向量库list中
	//			if v.VectorKey != `` {
	//				vectorKeyList = append(vectorKeyList, v.VectorKey)
	//			}
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//}

	// 删除摘要库
	err = services.DelLlmDoc(vectorKeyList, wechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "删除失败"
		br.ErrMsg = "删除失败,Err:" + err.Error()
		return
	}

	// 修改ES数据
	for _, wechatArticleAbstractId := range wechatArticleAbstractIdList {
		go services.AddOrEditEsWechatArticleAbstract(wechatArticleAbstractId)
	}

	br.Ret = 200
	br.Success = true
	br.Msg = `删除成功`
}

// AddVector
// @Title 删除摘要向量库
// @Description 删除摘要向量库
// @Param	request	body request.BeachOpAbstractReq true "type json string"
// @Success 200 Ret=200 新增成功
// @router /abstract/vector/add [post]
func (c *AbstractController) AddVector() {
	br := new(models.BaseResponse).Init()
	defer func() {
		c.Data["json"] = br
		c.ServeJSON()
	}()
	var req request.BeachOpAbstractReq
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常!"
		br.ErrMsg = "参数解析失败,Err:" + err.Error()
		return
	}
	if len(req.WechatArticleAbstractIdList) <= 0 && !req.IsSelectAll {
		br.Msg = "请选择摘要"
		br.IsSendEmail = false
		return
	}

	wechatArticleAbstractIdList := make([]int, 0)

	obj := rag.WechatArticleAbstract{}
	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	if err != nil {
		br.Msg = "修改失败"
		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
		if utils.IsErrNoRow(err) {
			br.Msg = "问题不存在"
			br.IsSendEmail = false
		}
		return
	}
	if len(list) > 0 {
		for _, v := range list {
			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
		}
	}

	//if !req.IsSelectAll {
	//	list, err := obj.GetByIdList(req.WechatArticleAbstractIdList)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//} else {
	//	notIdMap := make(map[int]bool)
	//	for _, v := range req.NotWechatArticleAbstractIdList {
	//		notIdMap[v] = true
	//	}
	//
	//	_, list, err := getAbstractList(req.KeyWord, req.TagId, 0, 100000)
	//	if err != nil {
	//		br.Msg = "修改失败"
	//		br.ErrMsg = "修改失败,查找问题失败,Err:" + err.Error()
	//		if utils.IsErrNoRow(err) {
	//			br.Msg = "问题不存在"
	//			br.IsSendEmail = false
	//		}
	//		return
	//	}
	//	if len(list) > 0 {
	//		for _, v := range list {
	//			if notIdMap[v.WechatArticleAbstractId] {
	//				continue
	//			}
	//			wechatArticleAbstractIdList = append(wechatArticleAbstractIdList, v.WechatArticleAbstractId)
	//		}
	//	}
	//}

	for _, wechatArticleAbstractId := range wechatArticleAbstractIdList {
		cache.AddWechatArticleLlmOpToCache(wechatArticleAbstractId, ``)
	}

	br.Ret = 200
	br.Success = true
	br.Msg = `添加向量库中,请稍后查看`
}

//func init() {
//	//微信文章
//	//{
//	//	obj := rag.WechatArticle{}
//	//	item, tmpErr := obj.GetById(1722)
//	//	if tmpErr != nil {
//	//		// 找不到就处理失败
//	//		return
//	//	}
//	//	services.GenerateWechatArticleAbstract(item, false)
//	//}
//
//	// ETA报告
//	{
//		obj := rag.RagEtaReport{}
//		item, tmpErr := obj.GetById(1)
//		if tmpErr != nil {
//			// 找不到就处理失败
//			return
//		}
//		services.GenerateRagEtaReportAbstract(item, false)
//	}
//
//	fmt.Println("结束")
//}