package models

import (
	"WorldEpcho/src/datasource"
	"errors"
	"fmt"
	"github.com/go-xorm/xorm"
	"strings"
)

type WorldConversation struct {
	Id        int64 `xorm:"'id' pk autoincr"`
	IsLiuId   string
	Uid       int64
	WorldId   int64  `xorm:"'world_id' unique"`
	WorldName string `xorm:"'world_name' unique"`
	Title     string
	UserInfo  string `xorm:" 'user_info'"`
	BgInfo    string
}

// AddWorld 添加一个新的世界到数据库
func AddWorldConversation(session *xorm.Session, conversation *WorldConversation) error {
	// 插入数据
	_, err := session.Insert(conversation)
	if err != nil {
		return err
	}

	return nil
}

// AddWorld 添加一个新的世界到数据库,并返回对象
func AddWorldConversation1(world WorldConversation) (*WorldConversation, error) {
	// 插入数据
	_, err := datasource.Engine.Insert(&world)
	if err != nil {
		return nil, err
	}

	return &world, nil
}

// GetDigitalPersonsByUserID 根据用户ID查询对应的数字人ID和名字
func GetWorldsByUserID(userID int64) ([]WorldInfo, error) {
	var worlds []WorldInfo
	err := datasource.Engine.Table("world_info").Join("INNER", "world_conversation", "world_info.id = world_conversation.world_id").
		Where("world_conversation.uid = ?", userID).
		//Select("digital_person.id, digital_person.name,digital_person.gender,catchphrases").
		Select("*").
		Find(&worlds)
	if err != nil {
		return nil, err
	}
	return worlds, nil
}

func GetWorldConversationsByUser(userID int64, worldName string) ([]WorldInfo, error) {
	var worlds []WorldInfo
	err := datasource.Engine.Table("world_info").
		Join("INNER", "world_conversation", "world_info.id = world_conversation.world_id").
		Where("world_conversation.uid = ?", userID).
		And("world_info.name LIKE ?", "%"+strings.TrimSpace(worldName)+"%").
		Select("*").
		Find(&worlds)
	if err != nil {
		return nil, fmt.Errorf("failed to fetch world conversations: %v", err)
	}
	return worlds, nil
}

// GetIsLiuIdByUidAndWorldName 根据用户id和WorldName查询IsLiuId
func GetWorldConversationByUidAndWorldName_Tx(session *xorm.Session, uid int64, worldName string) (*WorldConversation, bool, error) {
	// 检查输入有效性
	if uid == 0 || worldName == "" {
		return nil, false, errors.New("invalid parameters")
	}

	// 定义一个WorldConversation对象用于接收查询结果
	var world WorldConversation
	has, err := session.Where("uid = ? AND world_name = ?", uid, worldName).Get(&world)
	if err != nil {
		// 处理查询错误
		return nil, false, err
	}
	if !has {
		// 没有找到对应的记录
		return nil, false, nil
	}

	// 返回查找到的IsLiuId
	return &world, true, nil

}

// 根据用户id和世界id查询世界会话
func GetWorldConversationByUidAndWorldId_Tx(session *xorm.Session, uid, worldId int64) (*WorldConversation, bool, error) {
	// 检查输入有效性
	if uid == 0 || worldId == 0 {
		return nil, false, errors.New("invalid parameters")
	}

	// 定义一个WorldConversation对象用于接收查询结果
	var world WorldConversation
	has, err := session.Where("uid = ? AND world_id = ?", uid, worldId).Get(&world)
	if err != nil {
		// 处理查询错误
		return nil, false, err
	}
	if !has {
		// 没有找到对应的记录
		return nil, false, nil
	}

	// 返回查找到的IsLiuId
	return &world, true, nil

}

func GetWorldConversationByUidAndWorldName(uid int64, worldName string) (*WorldConversation, bool, error) {
	// 检查输入有效性
	if uid == 0 || worldName == "" {
		return nil, false, errors.New("invalid parameters")
	}

	// 定义一个WorldConversation对象用于接收查询结果
	var world WorldConversation
	has, err := datasource.Engine.Where("uid = ? AND world_name = ?", uid, worldName).Get(&world)
	if err != nil {
		// 处理查询错误
		return nil, false, err
	}
	if !has {
		// 没有找到对应的记录
		return nil, false, nil
	}

	// 返回查找到的IsLiuId
	return &world, true, nil
}

// GetWorldConversationByUidAndWorldId 根据用户id和WorldId查询世界会话信息
func GetWorldConversationByUidAndWorldId(uid, worldId int64) (*WorldConversation, bool, error) {
	// 检查输入有效性
	if uid == 0 || worldId == 0 {
		return nil, false, errors.New("invalid parameters")
	}

	// 定义一个WorldConversation对象用于接收查询结果
	var world WorldConversation
	has, err := datasource.Engine.Where("uid = ? AND world_id = ?", uid, worldId).Get(&world)
	if err != nil {
		// 处理查询错误
		return nil, false, err
	}
	if !has {
		// 没有找到对应的记录
		return nil, false, nil
	}

	// 返回查找到的IsLiuId
	return &world, true, nil
}

// UpdateDpConversations 更新会话信息
func UpdateWorldConversation(session *xorm.Session, WorldConversation *WorldConversation) error {
	_, err := session.ID(WorldConversation.Id).Update(WorldConversation)
	return err
}