package services

import (
	"eta/eta_api/models"
	"eta/eta_api/services/alarm_msg"
	"eta/eta_api/services/data"
	"eta/eta_api/utils"
	"fmt"
	"strings"
	"time"
)

func Task() {
	fmt.Println("task start")

	{
		// 修复客户试用数据
		//FixCompanyUpdateData()
		//FixCompanyTryDay()
		//FixCompanyTryDay()
		//StaticCompanyTryDay()
		//return
	}

	//FixPermissionStatus()
	//GetCompanyInfo()
	//ReportCount()
	//windSourceUrl:=`http://47.100.166.55:7002/edbInfo/wind/?EdbCode=M0001427&StartDate=2020-11-01&EndDate=2021-03-01`
	//data.AddAllArticle()

	//data.GetSmmIndex()
	//data.GetSmmIndexData()
	go AutoInsertLogToDB()

	//手工数据表格导入后的指标库刷新
	go ImportManualDataRefresh()

	//修复用户关注标识
	//GetWxUsersSubscribe()

	go AutoInsertAdminOperateRecordToDB()

	// 指标刷新
	go data.HandleEdbRefreshQueue()

	// 进行指标替换操作
	go DealReplaceEdbCache()

	// TODO:修复权限
	//FixEnCompanyPermission()
	fmt.Println("task end")
}

// 每日发布晨报
func AutoPublishDayReport() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("[AutoPublishDayReport]", err)
		}
	}()

	// 每日8:42发布晨报
	ticker := time.Tick(50 * time.Second)
	for range ticker {
		nowTime := time.Now()
		clock := nowTime.Format("1504")
		if clock == "0842" {
			if err := PublishTodayDayReport(); err != nil {
				go alarm_msg.SendAlarmMsg(fmt.Sprint("每日晨报自动发送 AutoPublishDayReport ERR:", err), 3)
				//utils.SendEmail(utils.APPNAME+" "+utils.RunMode+" 失败提醒", fmt.Sprint("AutoPublishDayReport ERR:", err), utils.EmailSendToUsers)
			}
		}
	}
}

// ImportManualDataRefresh 导入手工数据后的刷新
func ImportManualDataRefresh() {
	defer func() {
		if err := recover(); err != nil {
			fmt.Println("[ImportManualDataRefresh]", err)
		}
	}()
	for {
		utils.Rc.Brpop(utils.CACHE_IMPORT_MANUAL_DATA, func(b []byte) {
			edbCode := string(b)
			edbCode = strings.TrimPrefix(edbCode, `"`)
			edbCode = strings.TrimSuffix(edbCode, `"`)

			data.RefreshManualData(edbCode)
		})
	}
}

//func init()  {
//	fmt.Println("start task init")
//	UpdateEnglishEmailLogErrMsg()
//	fmt.Println("end task init")
//}
//
//// UpdateEnglishEmailLogErrMsg 更新英文邮件日志的ErrMsg(研报后台4.2上线后执行, 仅一次)
//func UpdateEnglishEmailLogErrMsg() {
//	var cond string
//	var pars []interface{}
//	list, e := models.GetEnglishReportEmailLogList(cond, pars)
//	if e != nil {
//		fmt.Println("获取日志列表失败")
//		return
//	}
//	for _, v := range list {
//		if v.SendStatus != 0 || v.Source != 1 || v.Result == "" || v.ErrMsg != "" {
//			continue
//		}
//		// 取出错误信息
//		fmt.Printf("正在更新%d\n", v.Id)
//		r := new(AliyunEmailResult)
//		if e = json.Unmarshal([]byte(v.Result), &r); e != nil {
//			fmt.Println("JSON解析报错了1" + e.Error())
//			continue
//		}
//		rd := new(AliyunEmailResultData)
//		res := strings.Replace(r.Data, `\`, ``, -1)
//		if e = json.Unmarshal([]byte(res), &rd); e != nil {
//			fmt.Println("JSON解析报错了2" + e.Error())
//			continue
//		}
//		v.ErrMsg = rd.Message
//		if e = v.Update([]string{"ErrMsg"}); e != nil {
//			fmt.Println("更新失败了" + e.Error())
//			continue
//		}
//	}
//	fmt.Println("更新成功")
//}

//func FixCompanyUpdateData1() {
//	list, err := company.GetCompanyProductUpdateLogList()
//	if err != nil {
//		fmt.Println("获取客户变更数据失败：", err)
//		return
//	}
//
//	nowTime := time.Now()
//	for _, v := range list {
//		//item, tmpErr := company.GetCompanyProductLogItem(v.CompanyId, v.ProductId, v.CreateTime)
//		//if tmpErr != nil {
//		//	fmt.Println(v.Id, "找数据，", tmpErr)
//		//	continue
//		//}
//
//		//permissionList := make([]*company.CompanyReportPermission, 0)
//		//switch v.Source {
//		//case "add", "receive", "thaw", "delay", "apply_receive":
//		//
//		//}
//		permissionList, err := company.GetCompanyReportPermission(v.CompanyId, v.ProductId)
//		if err != nil {
//			fmt.Println("err:", err)
//			continue
//		}
//
//		startDate := v.CreateTime
//		endDate := v.CreateTime.AddDate(0, 2, 0)
//		isStop := 1
//		realEndDate := endDate
//		if realEndDate.After(nowTime) {
//			realEndDate = nowTime
//			isStop = 0
//		}
//		for _, permission := range permissionList {
//			permission.StartDate = startDate.Format(utils.FormatDate)
//			permission.EndDate = v.CreateTime.Format(utils.FormatDate)
//		}
//		companyProductTryOutUpdateLogItem := &company.CompanyProductTryOutUpdateLog{
//			Id:          0,
//			CompanyId:   v.CompanyId,
//			ProductId:   v.ProductId,
//			SellerId:    v.SellerId,
//			SellerName:  v.SellerName,
//			Source:      v.Source,
//			StartDate:   startDate,
//			EndDate:     endDate,
//			RealEndDate: realEndDate,
//			IsStop:      isStop,
//			CreateTime:  v.CreateTime,
//		}
//		err = company.AddCompanyProductTryOutUpdateLog(companyProductTryOutUpdateLogItem, permissionList)
//	}
//	//fmt.Println("结束")
//}

//func FixCompanyUpdateData2() {
//	list, err := company.GetTryOutCompanyOperationRecordList()
//	if err != nil {
//		fmt.Println("获取客户变更数据失败：", err)
//		return
//	}
//
//	nowTime := time.Now()
//	for _, v := range list {
//		//item, tmpErr := company.GetCompanyProductLogItem(v.CompanyId, v.ProductId, v.CreateTime)
//		//if tmpErr != nil {
//		//	fmt.Println(v.Id, "找数据，", tmpErr)
//		//	continue
//		//}
//
//		//permissionList := make([]*company.CompanyReportPermission, 0)
//		//switch v.Source {
//		//case "add", "receive", "thaw", "delay", "apply_receive":
//		//
//		//}
//		permissionList, err := company.GetCompanyReportPermission(v.CompanyId, v.ProductId)
//		if err != nil {
//			fmt.Println("err:", err)
//			continue
//		}
//
//		startDate := v.CreateTime
//		endDate := v.CreateTime.AddDate(0, 2, 0)
//		isStop := 1
//		realEndDate := endDate
//		if realEndDate.After(nowTime) {
//			realEndDate = nowTime
//			isStop = 0
//		}
//		for _, permission := range permissionList {
//			permission.StartDate = startDate.Format(utils.FormatDate)
//			permission.EndDate = v.CreateTime.Format(utils.FormatDate)
//		}
//		sellerName := ``
//		{
//			sysUser, _ := system.GetSysAdminById(v.SellerId)
//			if sysUser != nil {
//				sellerName = sysUser.RealName
//			}
//		}
//		companyProductTryOutUpdateLogItem := &company.CompanyProductTryOutUpdateLog{
//			Id:          0,
//			CompanyId:   v.CompanyId,
//			ProductId:   v.ProductId,
//			SellerId:    v.SellerId,
//			SellerName:  sellerName,
//			Source:      "formal_to_try_out",
//			StartDate:   startDate,
//			EndDate:     endDate,
//			RealEndDate: realEndDate,
//			IsStop:      isStop,
//			CreateTime:  v.CreateTime,
//		}
//		err = company.AddCompanyProductTryOutUpdateLog(companyProductTryOutUpdateLogItem, permissionList)
//	}
//	fmt.Println("结束")
//}

// FixCompanyTryDay 修复试用天数
//func FixCompanyTryDay() {
//	list, err := company.GetCompanyProductTryOutUpdateGroup()
//	if err != nil {
//		fmt.Println("获取客户变更数据失败：", err)
//		return
//	}
//
//	lenList := len(list)
//	for k, v := range list {
//		fmt.Println("剩余", lenList-k-1, "条数据修复")
//		companyProduct, tmpErr := company.GetCompanyProductByCompanyIdAndProductId(v.CompanyId, v.ProductId)
//		if tmpErr != nil {
//			fmt.Println("company_id:", v.CompanyId, ";product_id:", v.ProductId, "；找不到对应的客户，Err:", tmpErr)
//			continue
//		}
//
//		logList, err := company.GetCompanyProductTryOutUpdateList(v.CompanyId, v.ProductId)
//		if err != nil {
//			fmt.Println("查找客户日志失败，err:", err)
//			continue
//		}
//
//		//lenLog := len(logList)
//		var day int //实际试用天数
//		var endDate time.Time
//		for _, log := range logList {
//			startDate := log.StartDate
//			if endDate.IsZero() {
//				endDate = log.RealEndDate
//				day = utils.GetTimeSubDay(startDate, log.RealEndDate) + 1
//			} else {
//				if log.RealEndDate.After(endDate) {
//					if endDate.After(startDate) {
//						startDate = endDate
//					}
//					if startDate.Equal(log.EndDate) {
//						day += utils.GetTimeSubDay(startDate, log.RealEndDate)
//					} else {
//						day += utils.GetTimeSubDay(startDate, log.RealEndDate) + 1
//					}
//					endDate = log.RealEndDate
//				}
//			}
//		}
//		companyProduct.TryOutDayTotal = day
//		companyProduct.Update([]string{"TryOutDayTotal"})
//	}
//	fmt.Println("结束")
//}

// StaticCompanyTryDay 定时任务每天更新试用天数
//func StaticCompanyTryDay() {
//	list, err := company.GetCompanyProductTryOutUpdateNoStopGroup()
//	if err != nil {
//		fmt.Println("获取客户变更数据失败：", err)
//		return
//	}
//
//	lenList := len(list)
//	for k, v := range list {
//		isAdd := false //是否要增加一天，默认不加
//		fmt.Println("剩余", lenList-k-1, "条数据修复")
//		permissionList, tmpErr := company.GetCompanyReportPermissionByStatus(v.CompanyId, v.ProductId, "试用")
//		if tmpErr == nil {
//			fmt.Println("company_id:", v.CompanyId, ";product_id:", v.ProductId, "；寻找对应的试用品种失败，Err:", tmpErr)
//			continue
//		}
//		currPermissionIdList := make([]int, 0) //当前试用的品种
//		for _, permission := range permissionList {
//			currPermissionIdList = append(currPermissionIdList, permission.ChartPermissionId)
//		}
//
//		//获取所有未停止的记录列表
//		logList, err := company.GetCompanyProductTryOutUpdateNoStopListByEndDate(v.CompanyId, v.ProductId)
//		if err != nil {
//			fmt.Println("查找客户日志失败，err:", err)
//			continue
//		}
//
//		logPermissionIdList := make([]int, 0) //当前日志中的试用的品种
//		for _, log := range logList {
//			//获取所有未停止的品种试用记录列表
//			logPermissionList, tmpErr := company.GetCompanyProductTryOutPermissionUpdateNoStopListByEndDate(log.Id)
//			if tmpErr != nil {
//				fmt.Println("查找客户品种变更日志失败，err:", tmpErr)
//				continue
//			}
//			lenLogPermissionList := len(logPermissionList) //当前日志存在试用的品种数量
//			stopPermission := 0                            //当前日志需要停止的品种数量
//
//			currTime := time.Now() //当前时间
//			for _, logPermission := range logPermissionList {
//				if utils.InArrayByInt(logPermissionIdList, logPermission.ChartPermissionId) {
//					// 如果已经被其他记录使用了，那么就将当前记录给标记停止
//					logPermission.IsStop = 1
//
//					// 如果当前时间晚于结束日期，那么实际结束日期就是今天之前一天，否则就是当天
//					if currTime.After(logPermission.EndDate) {
//						logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
//					} else {
//						logPermission.RealEndDate = time.Now()
//					}
//					logPermission.Update([]string{"IsStop", "RealEndDate"})
//					stopPermission++
//					continue
//				} else if !utils.InArrayByInt(currPermissionIdList, logPermission.ChartPermissionId) {
//					// 如果该品种不在当前客户的品种里面，那么也要将当前记录给标记停止
//					logPermission.IsStop = 1
//					// 如果当前时间晚于结束日期，那么实际结束日期就是今天之前一天，否则就是当天
//					if currTime.After(logPermission.EndDate) {
//						logPermission.RealEndDate = currTime.AddDate(0, 0, -1)
//					} else {
//						logPermission.RealEndDate = time.Now()
//					}
//					logPermission.Update([]string{"IsStop", "RealEndDate"})
//					stopPermission++
//					continue
//				}
//
//				// 剩下的说明还处于试用状态，需要添加1天试用期，且需要把该品种加入到当前日志中的试用的品种列表
//				isAdd = true
//				logPermissionIdList = append(logPermissionIdList, logPermission.ChartPermissionId)
//			}
//
//			//如果当前日志存在试用的品种数量 == 当前日志需要停止的品种数量
//			// 那么当前日志也是处于停用状态
//			if lenLogPermissionList == stopPermission {
//				log.IsStop = 1
//				// 如果当前时间晚于结束日期，那么实际结束日期就是今天之前一天，否则就是当天
//				if currTime.After(log.EndDate) {
//					log.RealEndDate = currTime.AddDate(0, 0, -1)
//				} else {
//					log.RealEndDate = time.Now()
//				}
//				log.Update([]string{"IsStop", "RealEndDate"})
//			}
//
//		}
//
//		// 如果需要添加，那么将该客户品种添加1天
//		if isAdd {
//
//		}
//		// 更新客户产品的试用天数
//		tmpErr = company.AddCompanyProductTryOutDayTotal(v.CompanyId, v.ProductId)
//		if tmpErr != nil {
//			fmt.Println("company_id:", v.CompanyId, ";product_id:", v.ProductId, "；更新客户产品的试用天数，Err:", tmpErr)
//			continue
//		}
//	}
//	fmt.Println("结束")
//}

//func Task2() {
//	fmt.Println("task start")
//
//	//_, _ = maycur.GetPublicOfferingSaleLeader()
//	//_ = maycur.TestSyncCompanyProfile()
//	//_ = maycur.SyncCompanyProfile()
//	//_ = maycur.ImportExcelEmployeeId()
//	//_ = maycur.ApiTest()
//	//_ = maycur.ApiTest2()
//	fmt.Println("task end")
//}

// FixEnCompanyPermission 英文权限上线时修复英文客户拥有所有权限(一次性)
func FixEnCompanyPermission() {
	var err error
	defer func() {
		if err != nil {
			fmt.Println("FixEnCompanyPermission Err: ", err.Error())
		}
	}()

	// 获取正式客户
	companies := make([]*models.EnglishCompany, 0)
	{
		cond := ` AND status = ?`
		pars := make([]interface{}, 0)
		pars = append(pars, 1)
		list, e := models.GetEnglishCompanyList(cond, pars, "")
		if e != nil {
			err = fmt.Errorf("GetEnglishCompanyList err: %s", e.Error())
			return
		}
		companies = list
	}

	// 获取所有权限
	permissions := make([]*models.EnPermission, 0)
	{
		cond := ` AND parent_id > ?`
		pars := make([]interface{}, 0)
		pars = append(pars, 0)
		ob := new(models.EnPermission)
		list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
		if e != nil {
			err = fmt.Errorf("GetPermissionItemsByCondition err: %s", e.Error())
			return
		}
		permissions = list
	}

	for _, c := range companies {
		ps := make([]*models.EnCompanyPermission, 0)
		for _, p := range permissions {
			ps = append(ps, &models.EnCompanyPermission{
				EnCompanyId:    c.CompanyId,
				EnPermissionId: p.EnPermissionId,
				CreateTime:     time.Now().Local(),
			})
		}
		if e := models.ClearAndCreateEnCompanyPermissions(c.CompanyId, ps); e != nil {
			err = fmt.Errorf("ClearAndCreateEnCompanyPermissions err: %s", e.Error())
			return
		}
	}
	fmt.Println("修复完成")
}

// ModifyEsEnglishReport 批量修改es里的英文研报信息和线上路演信息
func ModifyEsEnglishReport() {
	fmt.Println("开始")
	err := ModifyAllEsEnglishReportVideo()
	if err != nil {
		err = fmt.Errorf("重置es中的英文研报信息失败：ModifyAllEnglishReportInEs err: %s", err.Error())
		return
	}
	fmt.Println("结束")
}

//func InsertBloombergIndex() {
//	fmt.Println("开始写入")
//
//	start := 100000
//	now := time.Now()
//	for i := 1; i <= 100; i++ {
//		fmt.Printf("写入第%d个\n", i)
//
//		start += 1
//		index := new(data_manage.BaseFromBloombergIndex)
//		index.IndexCode = fmt.Sprintf("BLID%d", start)
//		index.IndexName = fmt.Sprintf("模拟Bloomberg-%s", index.IndexCode)
//		index.Unit = "无"
//		index.Source = utils.DATA_SOURCE_BLOOMBERG
//		index.Frequency = "日度"
//		index.StartDate = now.AddDate(0, 0, -i)
//		index.EndDate = now
//		index.CreateTime = time.Now().Local()
//		index.ModifyTime = time.Now().Local()
//		if e := index.Create(); e != nil {
//			fmt.Printf("新增指标失败, IndexCode: %s, err: %s", index.IndexCode, e.Error())
//			return
//		}
//
//		insertData := make([]*data_manage.BaseFromBloombergData, 0)
//		for ii := 0; ii <= 50; ii++ {
//			indexData := new(data_manage.BaseFromBloombergData)
//			indexData.BaseFromBloombergIndexId = index.BaseFromBloombergIndexId
//			indexData.IndexCode = index.IndexCode
//			indexData.DataTime = now.AddDate(0, 0, -ii)
//			va := GenerateRandomFloat64InRange()
//			va += float64(ii)
//			indexData.Value = va
//			indexData.CreateTime = time.Now().Local()
//			indexData.ModifyTime = time.Now().Local()
//			indexData.DataTimestamp = int(indexData.DataTime.UnixNano() / 1e6)
//			insertData = append(insertData, indexData)
//		}
//		ob := new(data_manage.BaseFromBloombergData)
//		if e := ob.CreateMulti(insertData); e != nil {
//			fmt.Printf("新增指标数据失败, IndexCode: %s, err: %s", index.IndexCode, e.Error())
//			return
//		}
//	}
//
//	fmt.Println("结束写入")
//}
//
//func GenerateRandomFloat64InRange() float64 {
//	var rnd = rand.New(rand.NewSource(time.Now().UnixNano())) // 设置随机数种子
//
//	return rnd.Float64()*11000 - 1000
//}
