package redismgr

import (
	"encoding/json"
	"server/common"

	"github.com/gomodule/redigo/redis"
	"github.com/name5566/leaf/log"
)

// 存储机器人的信息到 Redis
func SaveRobotInfoToRedis(robotID string, robotData *common.UserData) error {
	// 获取 Redis 连接
	conn := GetPool().Get()
	defer conn.Close()

	// 将机器人信息序列化成 JSON 字符串
	robotDataJson, err := json.Marshal(robotData)
	if err != nil {
		log.Debug("Error marshalling robot data: %v", err)
		return err
	}

	// 存储机器人信息，使用 HSET 命令
	_, err = conn.Do("HSET", "robot:"+robotID, "data", string(robotDataJson))
	if err != nil {
		log.Debug("Error saving robot data to Redis: %v", err)
		return err
	}

	// 设置过期时间（例如，设置3天过期）
	_, err = conn.Do("EXPIRE", "robot:"+robotID, 86400*3) // 86400*3 = 3天
	if err != nil {
		log.Debug("Error setting expiry for robot data in Redis: %v", err)
		return err
	}

	log.Debug("Robot %s data saved to Redis", robotID)
	return nil
}

// 更新机器人信息（例如更新积分）
func UpdateRobotPointsInRedis(robotID string, newPoints int32) error {
	// 获取 Redis 连接
	conn := GetPool().Get()
	defer conn.Close()

	// 获取现有的机器人信息
	robotData, err := GetRobotInfoFromRedis(robotID)
	if err != nil || robotData == nil {
		log.Debug("Error fetching robot data for update: %v", err)
		return err
	}

	// 更新积分
	robotData.Points = newPoints

	// 存储更新后的机器人信息
	err = SaveRobotInfoToRedis(robotID, robotData)
	if err != nil {
		log.Debug("Error saving updated robot data to Redis: %v", err)
		return err
	}

	log.Debug("Updated robot %s points to: %d", robotID, newPoints)
	return nil
}

// 获取机器人的信息从 Redis
func GetRobotInfoFromRedis(robotID string) (*common.UserData, error) {
	// 获取 Redis 连接
	conn := GetPool().Get()
	defer conn.Close()

	// 获取机器人信息
	robotDataJson, err := redis.String(conn.Do("HGET", "robot:"+robotID, "data"))
	if err == redis.ErrNil {
		// 如果没有找到机器人信息
		log.Debug("Robot data not found in Redis for robotID: %s", robotID)
		return nil, nil
	}
	if err != nil {
		log.Debug("Error fetching robot data from Redis: %v", err)
		return nil, err
	}

	// 将 JSON 字符串反序列化为 UserData 对象
	var robotData common.UserData
	err = json.Unmarshal([]byte(robotDataJson), &robotData)
	if err != nil {
		log.Debug("Error unmarshalling robot data: %v", err)
		return nil, err
	}

	log.Debug("Fetched robot data for robotID: %s", robotID)
	return &robotData, nil
}

// 将机器人添加到空闲队列
func AddRobotToFreeRobots(confID, robotID string) error {
	conn := GetPool().Get()
	defer conn.Close()

	// 将机器人ID推入到空闲队列的左侧
	_, err := conn.Do("LPUSH", "freeRobots:"+confID, robotID)
	if err != nil {
		log.Debug("Error adding robot to freeRobots queue: %v", err)
		return err
	}

	log.Debug("Robot %s added to freeRobots queue for confID: %s", robotID, confID)
	return nil
}

// 获取一个空闲状态的机器人ID
func GetFreeRobot(confID string) (string, error) {
	conn := GetPool().Get()
	defer conn.Close()

	// 从空闲队列的右侧弹出一个机器人ID
	robotID, err := redis.String(conn.Do("RPOP", "freeRobots:"+confID))
	if err == redis.ErrNil {
		// 如果队列为空，表示没有空闲机器人
		log.Debug("No free robots available in queue for confID: %s", confID)
		return "0", nil
	}
	if err != nil {
		log.Debug("Error fetching free robot from queue: %v", err)
		return "", err
	}

	log.Debug("Fetched free robot %s from queue for confID: %s", robotID, confID)
	return robotID, nil
}

func ResetRobotRoomID(robotID string) {
	conn := GetPool().Get()
	defer conn.Close()

	_, err := conn.Do("HSET", "robot:"+robotID, "Room_id", "0")
	if err != nil {
		log.Debug("Error resetting Room_id for robot %s: %v", robotID, err)
	} else {
		log.Debug("Successfully reset Room_id for robot %s", robotID)
	}
}
func AddRobotToFreeQueue(confID string, robotID string) {
	conn := GetPool().Get()
	defer conn.Close()

	_, err := conn.Do("LPUSH", "freeRobots:"+confID, robotID)
	if err != nil {
		log.Debug("Error adding robot %s back to free queue: %v", robotID, err)
	} else {
		log.Debug("Robot %s added back to free queue", robotID)
	}
}
