package handler

import (
	"chatplus/core/types"
	"chatplus/store/model"
	"chatplus/store/vo"
	"chatplus/utils"
	"chatplus/utils/resp"
	"gorm.io/gorm"

	"github.com/gin-gonic/gin"
)

// Update 更新会话标题
func (h *ChatHandler) Update(c *gin.Context) {
	var data struct {
		Id    uint   `json:"id"`
		Title string `json:"title"`
	}
	if err := c.ShouldBindJSON(&data); err != nil {
		resp.ERROR(c, types.InvalidArgs)
		return
	}
	var m = model.ChatItem{}
	m.Id = data.Id
	res := h.db.Model(&m).UpdateColumn("title", data.Title)
	if res.Error != nil {
		resp.ERROR(c, "Failed to update database")
		return
	}

	resp.SUCCESS(c, types.OkMsg)
}

// History 获取聊天历史记录
func (h *ChatHandler) History(c *gin.Context) {
	chatId := c.Query("chat_id") // 会话 ID
	var items []model.HistoryMessage
	var messages = make([]vo.HistoryMessage, 0)
	res := h.db.Where("chat_id = ?", chatId).Find(&items)
	if res.Error != nil {
		resp.ERROR(c, "No history message")
		return
	} else {
		for _, item := range items {
			var v vo.HistoryMessage
			err := utils.CopyObject(item, &v)
			v.CreatedAt = item.CreatedAt.Unix()
			v.UpdatedAt = item.UpdatedAt.Unix()
			if err == nil {
				messages = append(messages, v)
			}
		}
	}

	resp.SUCCESS(c, messages)
}

// Clear 清空所有聊天记录
func (h *ChatHandler) Clear(c *gin.Context) {
	// 获取当前登录用户所有的聊天会话
	user, err := utils.GetLoginUser(c, h.db)
	if err != nil {
		resp.NotAuth(c)
		return
	}

	var chats []model.ChatItem
	res := h.db.Where("user_id = ?", user.Id).Find(&chats)
	if res.Error != nil {
		resp.ERROR(c, "No chats found")
		return
	}

	var chatIds = make([]string, 0)
	for _, chat := range chats {
		chatIds = append(chatIds, chat.ChatId)
		// 清空会话上下文
		h.App.ChatContexts.Delete(chat.ChatId)
	}
	err = h.db.Transaction(func(tx *gorm.DB) error {
		res := h.db.Where("user_id =?", user.Id).Delete(&model.ChatItem{})
		if res.Error != nil {
			return res.Error
		}

		res = h.db.Where("user_id = ? AND chat_id IN ?", user.Id, chatIds).Delete(&model.HistoryMessage{})
		if res.Error != nil {
			return res.Error
		}

		// TODO: 是否要删除 MidJourney 绘画记录和图片文件？
		return nil
	})

	if err != nil {
		logger.Errorf("Error with delete chats: %+v", err)
		resp.ERROR(c, "Failed to remove chat from database.")
		return
	}

	resp.SUCCESS(c, types.OkMsg)
}
