package models

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

// NPCRole 表示一个 NPC 角色的全部信息
type NpcRole struct {
	ID                int64    `xorm:"'id' pk autoincr" json:"id"`                  //NPC角色ID
	Name              string   `xorm:"'name'" json:"name"`                          // 名称
	Details           string   `xorm:"'details' TEXT" json:"details"`               //详情 JSON string
	Gender            string   `xorm:"'gender'" json:"gender"`                      //性别
	Tags              []string `xorm:"'tags' json" json:"tags"`                     //世界标签集
	RelatedWorlds     []int64  `xorm:"'related_worlds' json" json:"related_worlds"` //相关世界
	UpdateTime        int64    `xorm:"updated" json:"update_time"`                  //更新时间
	CreateTime        int64    `xorm:"created" json:"create_time"`                  //构造时间
	ServiceProviderId string   `xorm:"-" json:"authId,omitempty"`                   // ServiceProviderId 在数据库中忽略
}

// Detail 用于解析详细信息中的 JSON 字符串
type Details struct {
	RoleName                string       `json:"roleName"`                //角色名称
	Introduction            Introduction `json:"introduction"`            //简介
	ConsumptionExpectations []string     `json:"consumptionExpectations"` //消费心理预期
	PsychologicalTraits     []string     `json:"psychologicalTraits"`     //心理特征
	Appearance              string       `json:"appearance"`              //外观
	Personality             string       `json:"personality"`             //性格
	DecisionMakingStyle     string       `json:"decisionMakingStyle"`     //决策风格
	RiskPreference          string       `json:"riskPreference"`          //风险偏好
	AttitudeTowardsUsers    string       `json:"attitudeTowardsUsers"`    //对用户的态度
}

//个人传记 Personal profile
type Introduction struct {
	EducationLevel         string `json:"educationLevel"`         //教育水平
	ProfessionalBackground string `json:"professionalBackground"` //职业背景
	Purpose                string `json:"purpose"`                //目的性
	KnownInformation       string `json:"knownInformation"`       //已知信息
}

// 增加一个新的 NPC 角色
func CreateNpcRole(session *xorm.Session, npcRole *NpcRole) (*NpcRole, error) {
	_, err := session.Insert(npcRole)
	if err != nil {
		return nil, fmt.Errorf("插入NPC角色失败: %v", err)
	}
	return npcRole, nil
}

// FindNpcRolesByWorldID 查询包含指定related_worlds ID的NPC角色数组
func FindNpcRolesByWorldID(session *xorm.Session, worldID int64) ([]NpcRole, error) {
	var npcRoles []NpcRole
	// 使用LIKE操作符来搜索包含特定world ID的文本字段
	worldIDStr := strconv.FormatInt(worldID, 10) // 将参与者ID转换为字符串
	query := fmt.Sprintf("[%s]", worldIDStr)
	err := session.Where("JSON_CONTAINS(related_worlds, ?)", query).Find(&npcRoles)
	if err != nil {
		return nil, fmt.Errorf("根据相关世界ID查询画像失败: %v", err)
	}
	return npcRoles, nil
}

// 根据 ID 删除 NPC 角色
func DeleteNpcRole(id int) error {
	npcRole := new(NpcRole)
	_, err := datasource.Engine.ID(id).Delete(npcRole)
	if err != nil {
		return fmt.Errorf("failed to delete npc role: %v", err)
	}
	return nil
}

// 更新 NPC 角色信息
func UpdateNpcRole(npcRole *NpcRole) error {
	_, err := datasource.Engine.ID(npcRole.ID).Update(npcRole)
	if err != nil {
		return fmt.Errorf("failed to update npc role: %v", err)
	}
	return nil
}

// 根据 ID 查询单个 NPC 角色
func GetNpcRoleByID(id int64) (*NpcRole, error) {
	npcRole := new(NpcRole)
	has, err := datasource.Engine.ID(id).Get(npcRole)
	if err != nil {
		return nil, fmt.Errorf("failed to get npc role: %v", err)
	}
	if !has {
		return nil, fmt.Errorf("npc role not found")
	}
	return npcRole, nil
}

// 查询所有 NPC 角色
func GetAllNpcRoles() ([]NpcRole, error) {
	var npcRoles []NpcRole
	err := datasource.Engine.Find(&npcRoles)
	if err != nil {
		return nil, fmt.Errorf("failed to get all npc roles: %v", err)
	}
	return npcRoles, nil
}
