package luatask

import (
	qu "qfw/util"
	"util"
)

type DC struct {
	DownRatio float64 //下浮比例
	UpRatio   float64 //上浮比例
}

//统计工作日(除周六周日)爬虫每天的下载量,并更新
// func GetDownloadNumber() {
// 	defer qu.Catch()
// 	logger.Debug("---统计爬虫每日下载量---")
// 	defer func() {
// 		logger.Debug("---统计爬虫每日下载量完毕---")
// 	}()
// 	weekDay := time.Now().Weekday().String()
// 	if weekDay != "Saturday" && weekDay != "Sunday" { //周二至周五统计前一天的下载量，周一统计上周五的数据
// 		yesterday := -1
// 		if weekDay == "Monday" {
// 			yesterday = -3
// 		}
// 		timeStr := time.Now().AddDate(0, 0, yesterday).Format("2006-01-02")
// 		startTime := util.GetTime(yesterday)
// 		endTime := startTime + 86400
// 		spiders := getAllSpider() //获取所有已运行爬虫
// 		logger.Debug(timeStr, "上架的爬虫个数：", len(spiders))
// 		lock := &sync.Mutex{}
// 		wg := &sync.WaitGroup{}
// 		ch := make(chan bool, 5)
// 		arr := [][]map[string]interface{}{}
// 		for code, reps := range spiders {
// 			ch <- true
// 			wg.Add(1)
// 			go func(code string, reps map[string]interface{}) {
// 				defer func() {
// 					<-ch
// 					wg.Done()
// 				}()
// 				update := []map[string]interface{}{}
// 				update = append(update, map[string]interface{}{"code": code})
// 				num := util.MgoS.Count("data_bak", map[string]interface{}{ //统计某个爬虫上个工作日的采集量
// 					"spidercode": code,
// 					"l_np_publishtime": map[string]interface{}{
// 						"$gte": startTime,
// 						"$lte": endTime,
// 					}})
// 				logger.Debug(code, timeStr+"下载量：", num)
// 				numStr := strconv.Itoa(num) //数量字符串
// 				//将下载量存库
// 				data, _ := util.MgoS.FindOne("spider_download", map[string]interface{}{"code": code})
// 				if data != nil && len(*data) > 0 { //已有爬虫下载量信息
// 					timeAndNum := qu.ObjArrToStringArr((*data)["timeAndNum"].([]interface{}))
// 					if len(timeAndNum) >= 15 { //只统计15天的量，超过15天去除第一个
// 						timeAndNum = timeAndNum[1:]
// 					}
// 					timeAndNum = append(timeAndNum, timeStr+":"+numStr)
// 					i := 0
// 					y := 0
// 					for _, tn := range timeAndNum {
// 						nStr := strings.Split(tn, ":")[1]
// 						nInt, _ := strconv.Atoi(nStr)
// 						if nInt > 0 || y > 0 { //不统计下载量大于0之前的数据
// 							y++
// 							i += nInt
// 						}
// 					}
// 					avFlush := float64(0)
// 					if y > 0 { //不全为0
// 						iF, _ := strconv.ParseFloat(strconv.Itoa(i), 64)
// 						yF, _ := strconv.ParseFloat(strconv.Itoa(y), 64)
// 						avFlush = math.Ceil(iF / yF) //平均值()向上取整
// 					}
// 					//根据浮动和平均值计算范围值
// 					dr, ur := float64(0), float64(0)
// 					if DownloadCheck[code] == nil {
// 						dr = DownloadCheck["other"].DownRatio
// 						ur = DownloadCheck["other"].UpRatio
// 					} else {
// 						dr = DownloadCheck[code].DownRatio
// 						ur = DownloadCheck[code].UpRatio
// 					}
// 					min := dr * avFlush
// 					max := ur * avFlush
// 					numerr := float64(num) >= min && float64(num) <= max //超出范围
// 					if avFlush == 0 {                                    //平均值0，下载量0，建异常任务
// 						numerr = false
// 					}
// 					update = append(update, map[string]interface{}{
// 						"$set": map[string]interface{}{
// 							"timeAndNum":      timeAndNum,                   //时间下载量集合
// 							"downloadNum":     map[string]int{timeStr: num}, //前一天下载量
// 							"averageDownload": avFlush,                      //平均值
// 							"isok":            numerr,                       //下载量是否异常
// 							"min":             min,                          //采集量下限
// 							"max":             max,                          //采集量上限
// 							"updatetime":      time.Now().Unix(),            //更新时间
// 						},
// 					})
// 				} else { //新增信息
// 					numF, _ := strconv.ParseFloat(strconv.Itoa(num), 64)
// 					update = append(update, map[string]interface{}{
// 						"$set": map[string]interface{}{
// 							"timeAndNum":      []string{timeStr + ":" + numStr},
// 							"code":            code,
// 							"averageDownload": numF,
// 							"downloadNum":     map[string]int{timeStr: num},
// 							"isok":            true,
// 							"site":            reps["s_site"],
// 							"channel":         reps["s_channel"],
// 							"comeintime":      time.Now().Unix(),
// 						},
// 					})
// 				}
// 				lock.Lock()
// 				if len(update) == 2 {
// 					arr = append(arr, update)
// 				}
// 				if len(arr) > 500 {
// 					tmps := arr
// 					MgoS.UpSertBulk("spider_download", tmps...)
// 					arr = [][]map[string]interface{}{}
// 				}
// 				lock.Unlock()
// 			}(code, reps)
// 		}
// 		wg.Wait()
// 		lock.Lock()
// 		if len(arr) > 0 {
// 			MgoS.UpSertBulk("spider_download", arr...)
// 			arr = [][]map[string]interface{}{}
// 		}
// 		lock.Unlock()
// 	} else {
// 		return
// 	}
// }

//获取所有爬虫
func getAllSpider() map[string]map[string]interface{} {
	fields := map[string]interface{}{
		"code":         1,
		"param_common": 1,
	}
	query := map[string]interface{}{
		"$or": []interface{}{
			map[string]interface{}{"state": 5},
			map[string]interface{}{
				"state": map[string]interface{}{
					"$in": []int{0, 1, 2},
				},
				"event": map[string]interface{}{
					"$ne": 7000,
				},
			},
		},
	}
	luas, _ := util.MgoE.Find("luaconfig", query, nil, fields, false, -1, -1)
	reps := map[string]map[string]interface{}{}
	for _, lua := range *luas {
		rep := map[string]interface{}{}
		code := qu.ObjToString(lua["code"])
		rep["s_code"] = code
		if param_common, ok := lua["param_common"].([]interface{}); ok {
			rep["s_site"] = param_common[1]
			if len(param_common) > 2 {
				rep["s_channel"] = param_common[2]
			} else {
				rep["s_channel"] = ""
			}
		}
		reps[code] = rep
	}
	return reps
}
