package ai

import (
	"encoding/json"
	"fmt"
	"hongze/hz_crm_api/controllers"
	"hongze/hz_crm_api/models"
	"hongze/hz_crm_api/models/aimod"
	"hongze/hz_crm_api/services/aiser"
	"hongze/hz_crm_api/utils"
	"strconv"
	"time"
)

// AI
type AiController struct {
	controllers.BaseAuthController
}

// @Title 聊天接口
// @Description 聊天接口
// @Param	request	body aimod.ChatReq true "type json string"
// @Success 200 {object} response.ListResp
// @router /chat [post]
func (this *AiController) List() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	var req aimod.ChatReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	if req.Model == "" {
		br.Msg = "请选择模型！"
		br.ErrMsg = "请选择模型!"
		return
	}

	if req.Ask == "" {
		br.Msg = "请输入提问内容！"
		br.ErrMsg = "请输入提问内容"
		return
	}

	if utils.Re == nil {
		key := "CACHE_CHAT_" + strconv.Itoa(this.SysUser.AdminId)
		cacheVal, err := utils.Rc.RedisInt(key)
		fmt.Println("RedisString:", cacheVal, "err:", err)
		if err != nil && err.Error() != "redigo: nil returned" {
			br.Msg = "获取数据失败！"
			br.ErrMsg = "获取数据失败，Err:" + err.Error()
			return
		}
		putVal := 0
		if cacheVal <= 0 {
			putVal = utils.AiChatLimit
		} else {
			putVal = cacheVal - 1
		}

		if putVal <= 0 {
			br.Msg = "您今日50次问答已达上限，请明天再来！"
			br.ErrMsg = "您今日50次问答已达上限，请明天再来！"
			return
		}
		lastSecond := utils.GetTodayLastSecond()
		utils.Rc.Put(key, putVal, lastSecond)
	}

	//根据提问，获取信息
	askUuid := utils.MD5(req.Ask)
	chatMode, err := aimod.GetAiChatByAsk(askUuid, req.Model)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "获取数据失败！"
		br.ErrMsg = "获取数据失败,GetAiChatByAsk，Err:" + err.Error()
		return
	}
	resp := new(aimod.ChatResp)
	var answer string
	//answerArr := []string{
	//	"周度数据显示，成品油现货市场价格跟随原油下跌，但近期相对抗跌，裂解价差走扩。批零价差方面汽油收窄，柴油走扩",
	//	"出口利润在原油下跌海外成品油矛盾更大的情况下汽柴油出口窗口完全关闭",
	//	"汽油需求在经历五一假期的一段高峰后将回归平稳，总体没有明显矛盾，后期我们担心更多的还是柴油。"}
	if chatMode != nil && chatMode.Answer != "" {
		answer = chatMode.Answer
	} else {
		//rnd := utils.GetRandInt(0, 3)
		//if rnd >= 3 {
		//	rnd = 2
		//}
		//answer = answerArr[rnd]
		var model int
		if req.Model == "gpt-3.5-turbo" {
			model = 1
		} else if req.Model == "gpt-3.5-turbo-16k" {
			model = 3
		} else if req.Model == "GPT4" {
			model = 4
		} else if req.Model == "GPT-4 Turbo" {
			model = 5
		} else {
			model = 2
		}
		answer, _ = aiser.ChatAutoMsg(req.Ask, model)
	}
	resp.Ask = req.Ask
	resp.Answer = answer

	if req.AiChatTopicId <= 0 { //新增
		topic := new(aimod.AiChatTopic)
		topic.TopicName = req.Ask
		topic.SysUserId = this.SysUser.AdminId
		topic.SysUserRealName = this.SysUser.RealName
		topic.CreateTime = time.Now()
		topic.ModifyTime = time.Now()
		topicId, err := aimod.AddAiChatTopic(topic)
		if err != nil {
			br.Msg = "获取数据失败！"
			br.ErrMsg = "生成话题失败，Err:" + err.Error()
			return
		}
		resp.AiChatTopicId = int(topicId)
		chatItem := new(aimod.AiChat)
		chatItem.AiChatTopicId = resp.AiChatTopicId
		chatItem.Ask = req.Ask
		chatItem.AskUuid = utils.MD5(req.Ask)
		chatItem.Answer = answer
		chatItem.Model = req.Model
		chatItem.SysUserId = this.SysUser.AdminId
		chatItem.SysUserRealName = this.SysUser.RealName
		chatItem.CreateTime = time.Now()
		chatItem.ModifyTime = time.Now()
		_, err = aimod.AddAiChat(chatItem)
		if err != nil {
			br.Msg = "获取数据失败！"
			br.ErrMsg = "生成话题记录失败，Err:" + err.Error()
			return
		}
	} else {
		resp.AiChatTopicId = req.AiChatTopicId
		chatItem := new(aimod.AiChat)
		chatItem.AiChatTopicId = resp.AiChatTopicId
		chatItem.Ask = req.Ask
		chatItem.AskUuid = utils.MD5(req.Ask)
		chatItem.Answer = answer
		chatItem.Model = req.Model
		chatItem.SysUserId = this.SysUser.AdminId
		chatItem.SysUserRealName = this.SysUser.RealName
		chatItem.CreateTime = time.Now()
		chatItem.ModifyTime = time.Now()
		_, err = aimod.AddAiChat(chatItem)
		if err != nil {
			br.Msg = "获取数据失败！"
			br.ErrMsg = "生成话题记录失败，Err:" + err.Error()
			return
		}
	}
	resp.Model = req.Model
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 获取话题列表
// @Description 获取话题列表接口
// @Success 200 {object} aimod.AiChatTopicListResp
// @router /topic/list [get]
func (this *AiController) TopicList() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}
	list, err := aimod.GetAiChatTopicList(sysUser.AdminId)
	if err != nil {
		br.Msg = "获取数据失败！"
		br.ErrMsg = "获取主题记录信息失败，Err:" + err.Error()
		return
	}
	resp := new(aimod.AiChatTopicListResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 获取话题详情
// @Description 获取话题详情接口
// @Param   AiChatTopicId   query   int  true       "主题id"
// @Success 200 {object} aimod.AiChatDetailResp
// @router /topic/detail [get]
func (this *AiController) TopicDetail() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}

	aiChatTopicId, _ := this.GetInt("AiChatTopicId")
	list, err := aimod.GetAiChatList(aiChatTopicId)
	if err != nil {
		br.Msg = "获取数据失败！"
		br.ErrMsg = "获取主题记录信息失败，Err:" + err.Error()
		return
	}
	resp := new(aimod.AiChatDetailResp)
	resp.List = list
	br.Ret = 200
	br.Success = true
	br.Msg = "获取成功"
	br.Data = resp
}

// @Title 删除话题接口
// @Description 删除话题接口
// @Param	request	body aimod.TopicDeleteReq true "type json string"
// @Success Ret=200 删除成功
// @router /topic/delete [post]
func (this *AiController) TopicDelete() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}

	var req aimod.TopicDeleteReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	if req.AiChatTopicId <= 0 {
		br.Msg = "参数错误！"
		br.ErrMsg = "参数错误！AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
		return
	}
	err = aimod.DeleteTopic(req.AiChatTopicId)
	if err != nil {
		br.Msg = "删除失败！"
		br.ErrMsg = "删除失败，Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "删除成功"
	br.IsAddLog = true
}

// @Title 编辑话题接口
// @Description 编辑话题接口
// @Param	request	body aimod.TopicEditReq true "type json string"
// @Success Ret=200 编辑成功
// @router /topic/edit [post]
func (this *AiController) TopicEdit() {
	br := new(models.BaseResponse).Init()
	defer func() {
		this.Data["json"] = br
		this.ServeJSON()
	}()

	sysUser := this.SysUser
	if sysUser == nil {
		br.Msg = "请登录"
		br.ErrMsg = "请登录，SysUser Is Empty"
		br.Ret = 408
		return
	}

	var req aimod.TopicEditReq
	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
	if err != nil {
		br.Msg = "参数解析异常！"
		br.ErrMsg = "参数解析失败，Err:" + err.Error()
		return
	}

	if req.AiChatTopicId <= 0 {
		br.Msg = "参数错误！"
		br.ErrMsg = "参数错误！AiChatTopicId:" + strconv.Itoa(req.AiChatTopicId)
		return
	}
	topic, err := aimod.GetAiChatTopicByTopicName(req.TopicName)
	if err != nil && err.Error() != utils.ErrNoRow() {
		br.Msg = "编辑失败！"
		br.ErrMsg = "获取数据失败！Err:" + err.Error()
		return
	}
	if topic != nil && topic.AiChatTopicId != req.AiChatTopicId {
		br.Msg = "话题名称已存在，请重新修改！"
		return
	}

	err = aimod.EditTopic(req.AiChatTopicId, req.TopicName)
	if err != nil {
		br.Msg = "编辑失败！"
		br.ErrMsg = "编辑失败，Err:" + err.Error()
		return
	}
	br.Ret = 200
	br.Success = true
	br.Msg = "编辑成功"
	br.IsAddLog = true
}
