package main

import (
	"cicv-data-closedloop/pjisuv_ticker"
	"fmt"
	"math"
	"sync"
	"time"
)

var (
	threshold float32 = 3.6 / 3.6
	Maxlenobj int32   = 0
)

// 定时任务触发器固定的
func Topic() string {
	return pjisuv_ticker.TickerTopic
}

// ******* 禁止存在下划线_
// 触发器标记
func Label() string {
	return "OvertakingRight"
}

func Rule(shareVars *sync.Map) {
	defer func() {
		if r := recover(); r != nil {
			fmt.Println("Recovered from panic:", r)
		}
	}()
	// 1 使用goroutine
	go func(shareVars *sync.Map) {
		// 2 定义触发器的间隔时间
		ticker := time.NewTicker(time.Duration(2) * time.Second)
		defer ticker.Stop()
		// 3 运行一个无限循环
		for {
			select {
			// 定时器触发时执行的代码
			case <-ticker.C:
				FinalCallback(shareVars)

			}
		}
	}(shareVars)
}
func IsOvertaken(yaw float64, ObjectList [][]float32) bool {
	for i, objX := range ObjectList[0] {
		diffangle := math.Abs(yaw - float64(ObjectList[4][i]))

		if ObjectList[1][i] >= -0.8 && ObjectList[1][i] <= 4 && objX >= 2.5 && diffangle <= 90 {
			for j := 0; j < len(ObjectList[0])-i-1; j++ {
				if ObjectList[1][i] >= -0.8 && ObjectList[1][i] <= 4 && ObjectList[0][1+i+j] <= -1.5 {
					return true
				}
			}
		}
	}

	return false
}

func FinalCallback(shareVars *sync.Map) {
	OutsideWorkshopFlag, ok := shareVars.Load("OutsideWorkshopFlag")
	AbsSpeed, ok3 := shareVars.Load("AbsSpeed")

	if ok && ok3 && AbsSpeed.(float32) > threshold {
		ObjDicOfTpperception, okn := shareVars.Load("objDicOfTpperception")
		ObjDic := ObjDicOfTpperception.(map[uint32][][]float32)
		Yaw, ok4 := shareVars.Load("YawOfCicvLocation")

		if okn && ok4 && OutsideWorkshopFlag.(bool) == true {
			for _, objValue := range ObjDic {
				Maxlenobj = max(Maxlenobj, int32(len(objValue[0])))
				if len(ObjDic[0]) <= 10 || !IsOvertaken(Yaw.(float64), objValue) {
					continue
				}
				event_lable := "OvertakingRight"
				fmt.Println(event_lable)
				ObjDicOfTpperception = make(map[uint32][][]float32)
				pjisuv_ticker.TickerChan <- pjisuv_ticker.TickInfo{FaultLabel: Label(), FaultHappenTime: pjisuv_ticker.GetNowTimeCustom()}
			}
			if Maxlenobj >= 100 {
				ObjDicOfTpperception = make(map[uint32][][]float32)
				shareVars.Store("ObjDicOfTpperception", ObjDicOfTpperception)
				Maxlenobj = 0
			}
		}
	}

}