package models

import (
	"WorldEpcho/src/datasource"
	"fmt"
	"log"
)

/*
构建Conversation表
*/
//Id|Uid|Did|title|descript
type Conversation struct {
	Id          int64  `json:"id"`   //会话Id
	Uid         int64  `json:"uid"`  //用户id
	DpId        int64  `json:"dpId"` //数字人Id
	AppId       int64  `json:"app_id"`
	Title       string `json:"title"`
	Description string `json:"description"`
	IsliuId     string `json:"isliuId"`
}

//向会话表中插入一条数据
func InsertConversation(conversation *Conversation) error {
	_, err := datasource.Engine.Insert(conversation)
	if err != nil {
		return fmt.Errorf("Failed to insert conversation: %s", err)
	}
	return nil
}

// 根据会话Id查询IsliuId
func GetIsliuIdById(id int64) (string, error) {
	conversation := &Conversation{Id: id}
	has, err := datasource.Engine.Get(conversation)
	if err != nil {
		return "", fmt.Errorf("Failed to get conversation: %s", err)
	}
	if !has {
		return "", fmt.Errorf("Conversation not found for Id: %d", id)
	}
	return conversation.IsliuId, nil
}

//根据用户id和数字人id，查询会话表中的会话记录
func GetConversationsByUserIdAndDpId(userId, dpId, appId int64) (*Conversation, error) {

	conversation := &Conversation{}
	has, err := datasource.Engine.Where("uid = ?", userId).And("dp_Id = ?", dpId).And("app_Id = ?", appId).Get(conversation)
	if err != nil {
		log.Println("Failed to get conversation:", err)
		return nil, err
	}
	if !has {
		return nil, nil
	}
	return conversation, nil
}

//根据会话对象更新会话信息
func UpdateConversation(conversation *Conversation) error {
	_, err := datasource.Engine.ID(conversation.Id).Update(conversation)
	return err
}

//根据会话对象更新会话信息，不存在则插入
func UpdateOrInsertConversation(conversation *Conversation) error {
	// 尝试更新记录
	affected, err := datasource.Engine.ID(conversation.Id).Update(conversation)
	if err != nil {
		// 错误处理
		return err
	}
	if affected == 0 {
		// 没有更新任何记录，可能是因为记录不存在
		// 执行插入操作
		_, err = datasource.Engine.InsertOne(conversation)
		return err
	}
	// 更新成功，没有错误发生
	return nil
}

// DeleteConversation 使用UID、DpId和AppId删除会话
func DeleteConversation(uid, dpId, appId int64) error {
	// 首先定义一个会话对象来接收查询结果
	var conversation Conversation

	// 检查是否存在相应的会话记录
	found, err := datasource.Engine.Where("uid = ?", uid).And("dpId = ?", dpId).And("app_id = ?", appId).Get(&conversation)
	if err != nil {
		return fmt.Errorf("查询会话出错: %v", err)
	}
	if !found {
		fmt.Println("没有找到指定的会话记录，不执行删除操作。")
		return nil // 早返回，避免执行不必要的删除
	}
	// 记录存在，执行删除操作
	affected, err := datasource.Engine.ID(conversation.Id).Delete(&Conversation{})
	if err != nil {
		return fmt.Errorf("删除会话出错: %v", err)
	}
	fmt.Printf("成功删除了 %d 个会话记录。\n", affected)
	return nil
}
