package dao

import (
	"fengkuangGameServerJob/model"
	"fengkuangGameServerJob/pkg/util"
	"fmt"
	"time"
)

// GetRobotsStationMissions 获取机器人的跑商任务列表
func GetRobotsStationMissions(robotIds []int, column []string) ([]*model.StationMission, error) {
	var missions []*model.StationMission
	err := DB().Select(column).
		Where("player_id = ?", 0).
		Where("robot_id IN ?", robotIds).
		Find(&missions).Error
	return missions, err
}

// GetPlayersStationMissions 获取玩家的跑商任务
func GetPlayersStationMissions(playerIds []int, column []string) ([]*model.StationMission, error) {
	var missions []*model.StationMission
	err := DB().Select(column).
		Where("player_id IN ?", playerIds).
		Where("robot_id = ?", 0).
		Find(&missions).Error
	return missions, err
}

// IncrStationPillages 增加记录被掠夺的次数
func IncrStationPillages(id, maxPillages int) (int64, error) {
	exec := DB().Exec(`UPDATE game_station_mission 
SET 
    pillages = pillages + 1
WHERE
    id = ? AND pillages < ? AND station_mission_id != 0 LIMIT 1;`, id, maxPillages)
	return exec.RowsAffected, exec.Error
}

// DestroyStation 破坏一个商队信息
func DestroyStation(id, addSeconds int) (int64, error) {
	nowUnix := time.Now().Unix()
	exec := DB().Exec(`UPDATE game_station_mission 
SET 
    destroy_end_unix = ?,
    end_unix = end_unix + ?
WHERE
    id = ? AND station_mission_id != 0
        AND end_unix > ? LIMIT 1;`, nowUnix+int64(addSeconds), addSeconds, id, nowUnix)
	return exec.RowsAffected, exec.Error
}

// ResetSingleMission 更新单个任务
func ResetSingleMission(missionInfo *model.StationMission) error {
	err := DB().Exec(`UPDATE game_station_mission 
SET 
    mission_serial_num = ?,
    station_mission_id = ?,
    end_unix = ?,
    destroy_end_unix = ?,
    pillages = ?
WHERE
    id = ? LIMIT 1;`, missionInfo.MissionSerialNum, missionInfo.StationMissionId, missionInfo.EndUnix, missionInfo.DestroyEndUnix, missionInfo.Pillages, missionInfo.ID).Error
	return err
}

// SaveRobotsMissions 保存机器人的跑商任务
func SaveRobotsMissions(missions []*model.StationMission) error {
	return DB().Create(&missions).Error
}

// SaveDestroyLogs 保存跑商掠夺破坏的日志
func SaveDestroyLogs(logs []*model.StationDestory) error {
	return DB().Create(&logs).Error
}

// AddRobotsToNearBy 将机器人加到附近的人列表中
func AddRobotsToNearBy(robotsSign []string, tcpId int) error {
	return Redis().SAdd(fmt.Sprintf("%s:%d", StationNearBy, tcpId), robotsSign).Err()
}

// GetStationRandNearBy 随机获取附近的人
func GetStationRandNearBy(tcpId, num int) ([]string, error) {
	key := fmt.Sprintf("%s:%d", StationNearBy, tcpId)
	return Redis().SRandMemberN(key, int64(num)).Result()
}

// GetTcpList 获取所有的tcpId
func GetTcpList() []int {
	var tcpIds []int
	err := DB().Raw("SELECT tcp_id FROM game_tcp WHERE tcp_state > 0").Scan(&tcpIds).Error
	util.CheckErr(err)
	return tcpIds
}

// GetServerIdsByTcp 根据tcpId来获取server_id
func GetServerIdsByTcp(tcpId int) []int {
	var serverIds []int
	err := DB().Raw("SELECT server_id FROM game_server WHERE tcp_id = ? AND server_state > 0", tcpId).Scan(&serverIds).Error
	util.CheckErr(err)
	return serverIds
}
