package models

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

//用户详情信息
type UserInfo struct {
	UserId       int64  `xorm:"'user_id' pk autoincr"`   // 用户ID
	UserName     string `json:"userName"`                //用户名
	UserSex      string `json:"userSex"`                 //性别
	Phone        string `json:"phone"`                   //手机号字段表中唯一约束
	IDCard       string `xorm:"'id_card'"`               // 身份证号(这里是否唯一)
	StudentId    string `xorm:"'student_id'"`            // 学号(这里是否唯一)
	ClassNo      string `xorm:"'class_no'"`              //班级号
	LoginIp      string `xorm:"login_ip" json:"loginIp"` //用户登录的ip
	Unit         string `xorm:"'unit'"`                  // 所在单位
	CreatedAt    int64  `xorm:"created"`                 // 创建时间
	UpdatedAt    int64  `xorm:"updated"`                 // 更新时间
	UserHeight   string `json:"userHeight"`              //用户身高
	UserWeight   string `json:"userWeight"`              //用户体重
	UserBirthday string `json:"userBirthday"`            //用户生日

}

/*
   为 UserInfo 结构体实现增删改查函数
*/

//添加用户详情信息到数据库
func CreateUserInfo(session *xorm.Session, user *UserInfo) error {
	_, err := session.Insert(user)
	if err != nil {
		fmt.Println(config.ColorGreen, "用户详细信息创建成功!", config.ColorReset)
		return err
	}
	return nil
}

// FindOrCreateUser 根据手机号或学号查询用户，若不存在则添加
/*
func FindOrCreateUser(engine *xorm.Engine, user *UserInfo) error {
	// 检查是否已存在相同的手机号或学号
	exist, err := engine.Where("phone = ? or student_id = ?", user.Phone, user.StudentId).Get(&UserInfo{})
	if err != nil {
		return err
	}
	// 如果用户不存在，创建新用户
	if !exist {
		_, err := engine.Insert(user)
		if err != nil {
			return err
		}
	}
	return nil
}*/

// GetUserInfoByPhone 根据手机号查询用户信息
func GetUserInfoByPhone(session *xorm.Session, phone string) (*UserInfo, bool, error) {
	var userInfo UserInfo
	exists, err := session.Where("phone = ?", phone).Get(&userInfo)
	if err != nil {
		return nil, false, err
	}
	return &userInfo, exists, nil
}

// FindOrCreateUser 根据手机号或学号查询用户，若不存在则添加，存在则更新
func FindOrCreateOrUpdateUserInfo(userinfo *UserInfo) error {
	var existingUser UserInfo
	var exist bool
	var err error

	// 如果学号字段是非空的，并据此进行查询
	if userinfo.StudentId != "" {
		exist, err = database.Engine.Where("student_id = ? ", userinfo.StudentId, userinfo.Unit).Get(&existingUser)
	}
	if err != nil {
		return err
	}

	if exist {
		// 如果用户存在，则更新用户信息
		_, err = database.Engine.ID(existingUser.UserId).Update(userinfo)
		if err != nil {
			return err
		}
	} else {
		// 如果用户不存在，创建新用户
		_, err := database.Engine.Insert(userinfo)
		if err != nil {
			return err
		}
	}
	return nil
}

func FindOrCreateOrUpdateUserInfoByPhone(session *xorm.Session, userinfo *UserInfo) error {
	var existingUser UserInfo
	var exist bool
	var err error

	if userinfo.Phone != "" {
		exist, err = session.Where("phone = ?", userinfo.Phone).Get(&existingUser)
	}
	if err != nil {
		return fmt.Errorf("根据手机号查询用户详情信息表失败! ")
	}

	if exist {
		// 如果用户存在，则更新用户信息
		_, err = session.Where("user_id = ?", existingUser.UserId).Update(userinfo)
		if err != nil {
			return err
		}
	} else {
		// 如果用户不存在，创建新用户
		_, err := session.Insert(userinfo)
		if err != nil {
			return err
		}
	}
	return nil
}

//根据用户Id查询用户详情信息
func GetUserInfo(userId int64) (*UserInfo, error) {
	user := UserInfo{UserId: userId}
	_, err := database.Engine.Get(&user)
	if err != nil {
		fmt.Println(config.ColorRed, "根据用户id获取用户详情信息失败!", config.ColorReset)
		return nil, err
	}
	return &user, nil
}

func GetUserInfoById(session *xorm.Session, userId int64) (*UserInfo, bool, error) {
	user := UserInfo{UserId: userId}
	_, err := session.Get(&user)
	if err != nil {
		fmt.Println(config.ColorRed, "根据用户id获取用户详情信息失败!", config.ColorReset)
		return nil, false, err
	}
	return &user, true, nil
}

//根据用户对象更新用户信息
func UpdateUserInfo(session *xorm.Session, user *UserInfo) error {

	_, err := session.Id(user.UserId).Update(user)
	if err != nil {
		fmt.Println(config.ColorRed, "更新用户失败!", config.ColorReset)
		return err
	}

	return nil
}

func EditUserInfo(user *UserInfo) error {

	_, err := database.Engine.Where("user_id = ?", user.UserId).Update(user)
	if err != nil {
		fmt.Println(config.ColorRed, "更新用户失败!", config.ColorReset)
		return err
	}

	return nil
}

// CreateOrUpdateUserInfo 检查用户是否存在，更新或创建用户信息
func CreateOrUpdateUserInfo(session *xorm.Session, user *UserInfo) error {
	exists, err := database.Engine.Id(user.UserId).Get(user)
	if err != nil {
		fmt.Println("检查用户是否存在时出错:", err)
		return err
	}

	if !exists {
		// 用户不存在，执行插入操作
		_, err := database.Engine.Insert(user)
		if err != nil {
			fmt.Println("创建用户失败:", err)
			return err
		}
		fmt.Println("用户创建成功")
	} else {
		// 用户存在，执行更新操作
		_, err := database.Engine.Id(user.UserId).Update(user)
		if err != nil {
			fmt.Println("更新用户失败:", err)
			return err
		}
		fmt.Println("用户更新成功")
	}

	return nil
}

//根据用户Id删除某个用户信息
func DeleteUser(userId int64) error {
	_, err := database.Engine.Id(userId).Delete(&UserInfo{})
	if err != nil {
		fmt.Println(config.ColorRed, "删除某个用户失败!", config.ColorReset)
		return err
	}
	return nil
}

// FindUserByStudentIdAndUnit 根据学号和所在单位查询用户详情
func FindUserByStudentIdAndUnit(session *xorm.Session, userInfo *UserInfo) (*UserInfo, bool, error) {
	var existingUser UserInfo
	// 检查 userInfo 中的 StudentId 和 Unit 是否非空
	if userInfo.StudentId == "" || userInfo.Unit == "" {
		return nil, false, fmt.Errorf("学号和单位名称为空")
	}

	// 根据提供的学号和单位查询用户
	exist, err := session.Where("student_id = ? AND unit = ?", userInfo.StudentId, userInfo.Unit).Get(&existingUser)
	if err != nil {
		return nil, false, err
	}
	if !exist {
		return nil, false, nil // 用户不存在时返回 nil 和 false
	}
	return &existingUser, true, nil // 用户存在时返回用户对象和 true
}
