package service

import (
	"blazing/cool"
	"blazing/modules/blazing/model"
	"encoding/json"
	"time"
)

func Exec[T cool.UserModel, F any](userid uint32, s *cool.Service, processFunc func(F) F) bool {
	//todo待测试
	var player T

	m1 := cool.DBM(s.Model).Where("player_id", userid)
	m1.Scan(&player)
	// 方法2：使用反射获取
	// 获取反射值对象

	ttt := player

	//fmt.Println(dataField.Interface().(string))
	var tt F
	err := json.Unmarshal([]byte(ttt.GetData()), &tt)
	if err != nil {
		panic(err)
	}
	tt1 := processFunc(tt)
	tmep, err := json.Marshal(tt1)
	if err != nil {
		panic(err)
	}

	ttt.SetData(string(tmep))
	m1.Save(player)
	return false
}

// func (s *UserService) InitTask() {

// 	tt := model.NewTask()
// 	tt.PlayerID = uint64(s.userid)

// 	var ggg []model.TaskInfo

// 	for i := 0; i < 500; i++ {
// 		ggg = append(ggg, model.TaskInfo{
// 			//TaskID:   (uint32(i)),
// 			TaskIinnfo: make([]uint32, 0),
// 		})

// 	}
// 	ffgg, _ := json.Marshal(ggg)
// 	tt.Data = string(ffgg)
// 	_, err := cool.DBM(s.task.Model).Data(tt).FieldsEx("id").Insert()
// 	if err != nil {
// 		panic(err)
// 	}
// 	//panic(err)

// }

// 获取任务信息
func (s *UserService) TaskInfo(id uint32) (ret model.TaskInfo, ok bool) {
	var gg model.Task
	m1 := cool.DBM(s.task.Model).
		Where("player_id", s.userid).
		Where("task_id", id)
	m1.Scan(&gg)

	if gg.TaskID == 0 {

		return ret, false
	}
	json.Unmarshal([]byte(gg.Data), &ret)
	return ret, true
}
func (s *UserService) TaskSet(id uint32, ret model.TaskInfo) {
	var gg model.Task

	tt, _ := json.Marshal(&ret)
	gg.Data = string(tt)
	//gg.TaskID = id
	cool.DBM(s.task.Model).Where("player_id", s.userid).Where("task_id", id).Update(gg)

}
func (s *UserService) TaskADD(id uint32, ret model.TaskInfo) {
	var gg model.Task

	tt, _ := json.Marshal(&ret)
	gg.Data = string(tt)
	gg.TaskID = id
	gg.PlayerID = uint64(s.userid)
	_, err := cool.DBM(s.task.Model).Data(gg).Where("player_id", s.userid).Insert()
	if err != nil {
		panic(err)
	}

}
func (s *UserService) TaskExec(t func([]model.TaskInfo) []model.TaskInfo) (ret bool) {

	//待实现检测是否为每日任务
	// if isdaliy {
	// 	Exec[*model.Task](s.userid, s.task, func(tt []model.TaskInfo) []model.TaskInfo {
	// 		var ttt = make([]model.TaskInfo, 500)
	// 		//先重置每日
	// 		for k, v := range tt {

	// 			if k > 400 && !IsToday(v.LastResetTime) { //判断是每日任务

	// 				v.Status = 0 //重置+自动接受每日任务
	// 				v.LastResetTime = time.Now()
	// 			}
	// 			ttt = append(ttt, v)
	// 		}

	// 		return ttt
	// 	})
	// }
	return Exec[*model.Task](s.userid, s.task, t)
	// m := cool.DBM(s.task.Model).Where("player_id", s.userid)
	// var tt model.Task
	// m.Scan(&tt)
	// var ttt map[uint32]model.TaskInfo
	// json.Unmarshal([]byte(tt.Data), &ttt)
	// ret = t(ttt)
	// t1, _ := json.Marshal(&ttt)
	// tt.Data = string(t1)
	// m.Save(&tt) //退出时保存
	// return
}

// IsToday 判断给定时间是否是今天
func IsToday(t time.Time) bool {
	// 获取当前时间
	now := time.Now()

	// 比较年、月、日是否相同
	return t.Year() == now.Year() &&
		t.Month() == now.Month() &&
		t.Day() == now.Day()
}

// /**
//  * 完成任务
//  */
// func (s *TaskService) CompleteTask(task uint32) bool {

// 	return s.Exec(func(ttt map[uint32]model.TaskInfo) bool {
// 		if conditions, ok := ttt[task]; ok {
// 			conditions.Status = 3
// 			ttt[task] = conditions

// 		}

// 		return false
// 	})
// }

// /**
//  * 校验任务是否已经完成
//  */
// func (s *TaskService) CheckTaskCompleted(task uint32) bool {

// 	return s.Exec(func(ttt map[uint32]model.TaskInfo) bool {
// 		if conditions, ok := ttt[task]; ok {

// 			return conditions.Status == 3
// 		}

//			return false
//		})
//	}
// func (s *UserService) GenTask() [500]byte {
// 	ret := [500]byte{}
// 	Exec[*model.Task](s.userid, s.task, func(tt []model.TaskInfo) []model.TaskInfo {

// 		//先重置每日
// 		for _, v := range tt {

// 			ret[v.TaskID] = v.Status

// 		}

// 		return tt
// 	})

// 	return ret

// }
