package service

//
//import (
//	"cicv-data-closedloop/aarch64/pjisuv/common/config"
//	commonConfig "cicv-data-closedloop/aarch64/pjisuv/common/config"
//	"cicv-data-closedloop/common/config/c_log"
//	"cicv-data-closedloop/common/util"
//	"cicv-data-closedloop/pjisuv_msgs"
//	"github.com/bluenviron/goroslib/v2"
//	"github.com/bluenviron/goroslib/v2/pkg/msgs/std_msgs"
//	"os"
//	"strings"
//	"sync"
//	"time"
//)
//
//var (
//	dir       = "/userdata/competition/"
//	dirBak    = "/userdata/competition-bak/"
//	ossPrefix = "competition/"
//	// v20240604 添加 /pj_vehicle_fdb_pub 判断人工接管场景
//	commandArgs            = []string{"record", "--split", "--duration=1", "/pji_gps", "/data_read", "/pj_vehicle_fdb_pub"}
//	topic                  = "/team_name"
//	urlExamTick            = "http://36.110.106.142:12341/web_server/exam/tick"
//	urlExamBegin           = "http://36.110.106.142:12341/web_server/exam/begin"
//	urlExamEnd             = "http://36.110.106.142:12341/web_server/exam/end"
//	cacheMutex             sync.Mutex
//	cacheTeamName          = make(map[string]time.Time)
//	heartBeatTimeThreshold = 5 * time.Second // 心跳时间
//	bakSecondNumber        = 3600
//	cachePositionX         = -999.00
//	cachePositionY         = -999.00
//	cacheAutoMode          = -1                // 自动驾驶状态 0 人工 1 自动
//	InitialPositionX       = 565266.0482367771 // todo 需要比赛确认起点
//	InitialPositionY       = 4329773.48728322  // todo 需要比赛确认起点
//)
//
//// todo 实车比赛临时使用
//// history record命令无法录制（）
//func ForCompetition() {
//	go dataCollection()
//	go dataCollectionBak(bakSecondNumber) // 需要再车上备份的数据，防止网络差传不回来
//	go location()                         // 记录经纬度和速度
//	go mode()                             // 记录自动驾驶状态
//	go tick()
//}
//
//// 全量数据采集
//func dataCollection() {
//	c_log.GlobalLogger.Info("开始采集实车算法比赛全量数据。")
//	util.CreateDir(dir)
//	// 1 打包
//	c_log.GlobalLogger.Info("采集实车算法比赛全量数据的环境变量为：", commonConfig.RosbagEnvs)
//	command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dir, commonConfig.RosbagPath, commandArgs...)
//	if err != nil {
//		c_log.GlobalLogger.Error("程序崩溃。执行record命令", command, "出错：", err)
//		os.Exit(-1)
//	}
//	// 2 扫描目录文件
//	for {
//		time.Sleep(time.Duration(2) * time.Second)
//		files, _ := util.ListAbsolutePathAndSort(dir)
//		if len(files) >= 2 {
//			//c_log.GlobalLogger.Info("扫描实车比赛数据采集目录，", files)
//			for i := range files {
//				if i == len(files)-1 { // 最后一个包在录制中，不上传
//					break
//				}
//				c_log.GlobalLogger.Debug("上传实车算法比赛全量数据包", files[i])
//				bagSlice := strings.Split(files[i], "/")
//				commonConfig.OssMutex.Lock()
//				_ = commonConfig.OssBucket.PutObjectFromFile(ossPrefix+config.LocalConfig.EquipmentNo+"/"+bagSlice[len(bagSlice)-1], files[i])
//				commonConfig.OssMutex.Unlock()
//				_ = util.DeleteFile(files[i])
//			}
//		}
//	}
//}
//
//// 全量数据采集
//func dataCollectionBak(bakSecondNumber int) {
//	c_log.GlobalLogger.Info("开始备份实车算法比赛全量数据。")
//	util.CreateDir(dirBak)
//	// 1 打包
//	command, err := util.ExecuteWithEnvAndDirAsync(commonConfig.RosbagEnvs, dirBak, commonConfig.RosbagPath, commandArgs...)
//	if err != nil {
//		c_log.GlobalLogger.Error("程序崩溃。备份目录执行record命令", command, "出错：", err)
//		os.Exit(-1)
//	}
//	// 2 扫描目录文件
//	for {
//		time.Sleep(time.Duration(2) * time.Second)
//		files, _ := util.ListAbsolutePathAndSort(dirBak)
//		if len(files) >= bakSecondNumber {
//			// 超出阈值就删除心跳+1个文件
//			_ = util.DeleteFile(files[0])
//			_ = util.DeleteFile(files[1])
//			_ = util.DeleteFile(files[2])
//		}
//	}
//}
//
//// data格式为队伍编号
//// 保存单次考试时间区间
//func location() {
//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
//		Node:  commonConfig.RosNode,
//		Topic: "/cicv_location",
//		Callback: func(data *pjisuv_msgs.PerceptionLocalization) {
//			cachePositionX = data.PositionX
//			cachePositionY = data.PositionY
//		},
//	})
//}
//
//func mode() {
//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
//		Node:  commonConfig.RosNode,
//		Topic: "/pj_vehicle_fdb_pub",
//		Callback: func(data *pjisuv_msgs.VehicleFdb) {
//			cacheAutoMode = int(data.Automode)
//		},
//	})
//}
//
//// data格式为队伍编号
//// 保存单次考试时间区间
//func tick() {
//	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
//		Node:  commonConfig.RosNode,
//		Topic: topic,
//		Callback: func(data *std_msgs.String) {
//			if cacheAutoMode == 1 { // 只有在自动驾驶状态才发送心跳
//				//if math.Abs(positionX-InitialPositionX) > 5.00 || math.Abs(positionY-InitialPositionY) > 5.00 { // todo 测试临时使用起点判断
//				teamName := data.Data
//				response, err := util.HttpPostJsonWithHeaders(
//					urlExamTick,
//					map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
//					map[string]string{
//						"teamName":    teamName,
//						"positionX":   util.ToString(cachePositionX),
//						"positionY":   util.ToString(cachePositionY),
//						"equipmentNo": config.LocalConfig.EquipmentNo, // 设备编号
//					},
//				)
//				if err != nil {
//					c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端报错，错误信息为：%v。", teamName, err)
//				}
//				c_log.GlobalLogger.Infof("队伍 %v 的心跳发送到云端，响应结果为：%v。", teamName, response)
//			}
//		},
//	})
//}
//
////// data格式为队伍编号
////// 保存单次考试时间区间
////func examBeginBak() {
////	_, _ = goroslib.NewSubscriber(goroslib.SubscriberConf{
////		Node:  commonConfig.RosNode,
////		Topic: topic,
////		Callback: func(data *std_msgs.String) {
////			teamName := data.Data
////			cacheMutex.Lock()
////			{
////				if !util.ContainsKey(cacheTeamName, teamName) { // 1 如果缓存数组中没有此队名，代表考试开始，缓存此队名，和当前时间戳
////					examBeginTime := time.Now()
////					cacheTeamName[teamName] = examBeginTime
////					_, _ = util.HttpPostJsonWithHeaders(
////						urlExamBegin,
////						map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
////						map[string]string{"teamName": teamName},
////					)
////					c_log.GlobalLogger.Infof("队伍 %v 的考试开始。", teamName)
////				} else { // 2 如果缓存数组中有此队名，代表考试进行中，刷新时间戳
////					cacheTeamName[teamName] = time.Now()
////				}
////			}
////			cacheMutex.Unlock()
////		},
////	})
////}
////
////func examEndBak() {
////	for {
////		time.Sleep(time.Duration(1) * time.Second)
////		cacheMutex.Lock()
////		{
////			var keysToDelete []string
////			for teamName, heartBeatTime := range cacheTeamName {
////				if time.Since(heartBeatTime) > heartBeatTimeThreshold { // 检查缓存中的队名，如果超过心跳时间，则代表考试结束，删除缓存中的队名
////					keysToDelete = append(keysToDelete, teamName)
////				}
////			}
////			for _, teamName := range keysToDelete { // 检查缓存中的队名，如果超过心跳时间，则代表考试结束，删除缓存中的队名
////				delete(cacheTeamName, teamName)
////				_, _ = util.HttpPostJsonWithHeaders(
////					urlExamEnd,
////					map[string]string{"Authorization": "U9yKpD6kZZDDe4LFKK6myAxBUT1XRrDM"},
////					map[string]string{"teamName": teamName},
////				)
////				c_log.GlobalLogger.Infof("队伍 %v 的考试结束。", teamName)
////			}
////		}
////		cacheMutex.Unlock()
////	}
////}
