package services

import (
	"encoding/json"
	"fmt"
	"hongze/mysteel_watch/cache"
	"hongze/mysteel_watch/global"
	"hongze/mysteel_watch/models/index"
	"hongze/mysteel_watch/services/alarm_msg"
	"hongze/mysteel_watch/utils"
	"os"
	"strings"
	"sync"
	"time"

	"github.com/xuri/excelize/v2"
)

const (
	FormatTime    = "15:04:05" //时间格式
	FormatTimeStr = "15:04"    //时间格式
)

var checkLock sync.RWMutex

func IndexCreateCheck() (err error) {
	checkLock.Lock()
	defer func() {
		checkLock.Unlock()
	}()
	fmt.Println("IndexCreateCheck")
	indexObj := new(index.BaseFromMysteelChemicalIndex)
	list, err := indexObj.GetIndexCreate()
	if err != nil {
		return
	}
	fmt.Println("listLen:", len(list))
	if len(list) <= 0 {
		return nil
	}
	var indexCode []string
	for _, v := range list {
		indexCode = append(indexCode, v.IndexCode)
	}
	indexCodeStr := strings.Join(indexCode, ";")
	fmt.Println("indexCodeStr:" + indexCodeStr)
	go alarm_msg.SendAlarmMsg(utils.APPNAME+" 存在指标数据未生成:"+indexCodeStr, 3)
	for _, v := range list {
		fmt.Println("IndexCreateCheck start:", v.IndexCode, v.FilePath)
		if v.FilePath != "" && utils.FileIsExist(v.FilePath) {
			fmt.Println("Refresh:" + v.IndexCode)
			err = UpdateComment(v.FilePath)
			if err != nil {
				fmt.Println("UpdateComment Err:" + err.Error())
				go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3)
			}
			time.Sleep(1 * time.Second)
			//MysteelChemicalRefresh(v.FilePath)
			AddIndexRefreshToLpush(v.FilePath)
		} else {
			fmt.Println("IndexCreate:" + v.IndexCode)
			saveFilePath, err := IndexCreate(v)
			if err != nil {
				fmt.Println("IndexCreate Err:" + err.Error())
				go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error(), 3)
			}
			v.FilePath = saveFilePath
			fmt.Println("IndexCreate saveFilePath:" + v.FilePath)
			time.Sleep(1 * time.Second)
			if utils.FileIsExist(saveFilePath) {
				//MysteelChemicalRefresh(saveFilePath)
				AddIndexRefreshToLpush(saveFilePath)
			}
			fmt.Println("MysteelChemicalRefresh end:" + v.IndexCode)
		}
		fmt.Println("IndexCreateCheck end:" + v.IndexCode)
	}
	return nil
}

func IndexCreate(item *index.BaseFromMysteelChemicalIndex) (saveFilePath string, err error) {
	item.UpdateWeek = utils.GetUpdateWeekEn(item.UpdateWeek)
	global.LOG.Info("task IndexCreate:" + time.Now().Format(utils.FormatDateTime))
	runMode := "release"
	//fileName := req.IndexName + "_" + req.IndexCode + ".xlsx"
	var fileName string
	if item.UpdateWeek != "" {
		fileName = item.IndexCode + "_" + item.UpdateWeek + "_" + runMode + ".xlsx" //保存的文件名称
	} else {
		fileName = item.IndexCode + "_" + runMode + ".xlsx" //保存的文件名称
	}
	filePath := utils.IndexSaveDir + fileName
	if utils.FileIsExist(filePath) {
		os.Remove(filePath)
	}
	templatePath := utils.IndexSaveDir + "index_template.xlsx"
	templateFile, err := excelize.OpenFile(templatePath)
	if err != nil {
		fmt.Println("OpenFile template err:" + err.Error())
		return
	}

	defer func() {
		templateFile.Close()
	}()

	startDate := "1990-01-01"
	commentStr := `"BlankValue":"0","CanMark":true,"ChartLineType":"0","DateBlock":0,"DateBlockCount":1,"DateFormat":0,"DateTimeTag":"","EndDate":"","ExportType":0,"HasDescription":true,"HasEmptyRows":false,"HasFrequency":true,"HasIndexID":true,"HasLastDate":true,"HasSourceName":true,"HasTimeInterval":true,"HasUnit":true,"HasUpdateDate":true,"IsCreateChart":false,"IsDataSort":true,"IsNewSheet":false,"IsNewWorkbook":false,"Models":[{"DataFormat":0,"DataStartDate":"` + startDate + `","DefineName":"","DefineUnit":"","DisplayIndexCode":"` + item.IndexCode + `","IndexCode":"` + item.IndexCode + `","IndexFormula":"` + item.IndexCode + `","PointValue":0,"UnionStart":""}],"Position":"A1","RangeData":"A2:B280","ShowBlankLines":false,"StartDate":"","Transpose":false,"UpdateMode":1,"lookModel":{"IsLast":false,"LookValue":0,"lookType":0},"ver":3}
`
	commentMap := make(map[string]interface{})
	commentMap["author"] = "{"
	commentMap["text"] = commentStr

	commentJson, err := json.Marshal(commentMap)
	if err != nil {
		fmt.Println("json.Marshal err:" + err.Error())
	}

	fmt.Println("commentJson")
	fmt.Println(string(commentJson))
	templateFile.DeleteComment("Sheet1", "A1")
	templateFile.AddComment("Sheet1", "A1", string(commentJson))
	if err := templateFile.SaveAs(filePath); err != nil {
		fmt.Println(err)
		return "", err
	}
	saveFilePath = filePath
	return
}

//func IndexRefreshAll() {
//	fmt.Println("IndexCreateCheck")
//	indexObj := new(index.BaseFromMysteelChemicalIndex)
//	list, err := indexObj.GetIndexRefreshAll()
//	if err != nil {
//		fmt.Println("GetIndexRefreshAll Err:" + err.Error())
//		return
//	}
//	fmt.Println("listLen:", len(list))
//	if len(list) <= 0 {
//		return
//	}
//	nowDate := time.Now().Format(utils.FormatDate)
//	monthLastDay := utils.GetNowMonthLastDay()
//	monthLastDayStr := monthLastDay.Format(utils.FormatDate)
//	yearLast := strconv.Itoa(time.Now().Year()) + "12-31"
//	for _, v := range list {
//		err = UpdateComment(v.FilePath)
//		if err != nil {
//			go alarm_msg.SendAlarmMsg(utils.APPNAME+" 指标数据未生成检测失败:"+err.Error()+";file:"+v.FilePath, 3)
//		}
//		time.Sleep(1 * time.Second)
//		if v.Frequency == "周度" {
//			if v.UpdateWeek == "" && v.UpdateTime == "" && v.UpdateTime2 == "" {
//				//判断本周的数据是否已经存在
//				MysteelChemicalRefresh(v.FilePath)
//			}
//		} else if v.Frequency == "月度" || v.Frequency == "旬度" {
//			if nowDate == monthLastDayStr {
//				MysteelChemicalRefresh(v.FilePath)
//			}
//		} else if v.Frequency == "年度" && nowDate == yearLast {
//			if nowDate == yearLast {
//				MysteelChemicalRefresh(v.FilePath)
//			}
//		} else if v.Frequency == "日度" {
//			if v.EndDate.Format(utils.FormatDate) != nowDate {
//				MysteelChemicalRefresh(v.FilePath)
//			}
//		} else {
//			global.LOG.Info("无效频度:" + v.IndexCode + ";" + v.Frequency)
//		}
//	}
//	return
//}

func IndexRefreshAll() {
	fmt.Println("IndexCreateCheck")
	indexObj := new(index.BaseFromMysteelChemicalIndex)
	list, err := indexObj.GetIndexRefreshAllByMergeFile()
	if err != nil {
		fmt.Println("GetIndexRefreshAll Err:" + err.Error())
		return
	}
	fmt.Println("listLen:", len(list))
	if len(list) <= 0 {
		return
	}
	now := time.Now()
	month := int(now.Month())
	day := now.Day()
	week := int(now.Weekday())

	for _, v := range list {
		rn := utils.GetRandInt(1, 10)
		time.Sleep(time.Duration(rn) * time.Second)
		if v.Frequency == "年度" {
			if month == 1 && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "季度" {
			if (month == 1 || month == 4 || month == 7 || month == 10) && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "月度" {
			if day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "周度" {
			if week > 2 && week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else {
			if week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		}
	}
	return
}

func IndexRefreshMethanol() {
	fmt.Println("IndexRefreshMethanol")
	indexObj := new(index.BaseFromMysteelChemicalIndex)
	list, err := indexObj.GetIndexRefreshMethanolByMergeFile()
	if err != nil {
		fmt.Println("GetIndexRefreshAll Err:" + err.Error())
		return
	}
	fmt.Println("listLen:", len(list))
	if len(list) <= 0 {
		return
	}
	now := time.Now()
	month := int(now.Month())
	day := now.Day()
	week := int(now.Weekday())
	for _, v := range list {
		rn := utils.GetRandInt(1, 10)
		time.Sleep(time.Duration(rn) * time.Second)
		time.Sleep(3 * time.Second)
		if v.Frequency == "年度" {
			if month == 1 && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "季度" {
			if (month == 1 || month == 4 || month == 7 || month == 10) && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "月度" {
			if day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "周度" {
			if week > 2 && week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else {
			if week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		}
	}
	return
}



func IndexRefreshTimely() {
	fmt.Println("IndexRefreshTimely")
	go alarm_msg.SendAlarmMsg(utils.APPNAME+" 及时刷新指标", 3)

	indexObj := new(index.BaseFromMysteelChemicalIndex)
	list, err := indexObj.GetIndexRefreshMethanolByTimely()
	if err != nil {
		fmt.Println("GetIndexRefreshAll Err:" + err.Error())
		return
	}
	fmt.Println("listLen:", len(list))
	if len(list) <= 0 {
		return
	}
	now := time.Now()
	month := int(now.Month())
	day := now.Day()
	week := int(now.Weekday())
	for _, v := range list {
		rn := utils.GetRandInt(1, 10)
		time.Sleep(time.Duration(rn) * time.Second)
		time.Sleep(3 * time.Second)
		if v.Frequency == "年度" {
			if month == 1 && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "季度" {
			if (month == 1 || month == 4 || month == 7 || month == 10) && day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "月度" {
			if day == 1 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else if v.Frequency == "周度" {
			if week > 2 && week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		} else {
			if week < 6 {
				//MysteelChemicalRefresh(v.MergeFilePath)
				AddIndexRefreshToLpush(v.MergeFilePath)
			}
		}
	}
	return
}


var lock sync.RWMutex

//刷新周度指标数据
func IndexRefreshWeek() {
	lock.Lock()
	nowWeek := time.Now().Weekday().String()
	nowWeekZn := utils.GetWeekZn(nowWeek)
	fmt.Println("nowWeekZn:" + nowWeekZn)

	indexObj := new(index.BaseFromMysteelChemicalIndex)

	startTime := time.Now().Add(-1 * time.Minute).Format(FormatTimeStr)
	endTime := time.Now().Add(1 * time.Minute).Format(FormatTimeStr)

	list, err := indexObj.GetIndexRefreshWeek(nowWeekZn, startTime, endTime)
	if err != nil {
		fmt.Println("GetIndexRefreshWeek Err:" + err.Error())
		return
	}
	fmt.Println("listLen:", len(list))
	if len(list) <= 0 {
		return
	}
	for _, v := range list {
		if global.Re == nil && global.Rc != nil {
			key := utils.REFRESH_INDEX_CODE + v.IndexCode
			if global.Rc.SetNX(key, v.FilePath, 5*time.Hour) {
				cache.IndexAutoRefresh(v.FilePath)
			}
		}
	}
	lock.Unlock()
	return
}

// 修改指标备注指标
func UpdateComment(filePath string) (err error) {
	templateFile, err := excelize.OpenFile(filePath)
	if err != nil {
		fmt.Println("OpenFile Err:" + err.Error())
		return
	}
	defer func() {
		templateFile.Close()
	}()

	commentArr := templateFile.GetComments()
	for k, v := range commentArr {
		fmt.Println(k, v)
		for _, sv := range v {
			fmt.Println("text:", sv.Text)
			if strings.Contains(sv.Text, `"UpdateMode":0`) {
				newText := strings.Replace(sv.Text, `"UpdateMode":0`, `"UpdateMode":1`, -1)
				newText = strings.Trim(newText, "{")

				commentMap := make(map[string]interface{})
				commentMap["author"] = "{"
				commentMap["text"] = newText

				commentJson, err := json.Marshal(commentMap)
				if err != nil {
					fmt.Println("json.Marshal err:" + err.Error())
				}
				fmt.Println("add text:" + string(commentJson))
				templateFile.DeleteComment("Sheet1", "A1")
				err = templateFile.AddComment("Sheet1", "A1", string(commentJson))
				if err != nil {
					fmt.Println("AddComment Err:" + err.Error())
					return err
				}
			}
		}
	}
	if err := templateFile.SaveAs(filePath); err != nil {
		fmt.Println("templateFile.SaveAs Err:", err)
		return err
	}
	return
}

// 获取指标备注指标
func GetComment(filePath string) string {
	excelFile, err := excelize.OpenFile(filePath)
	if err != nil {
		fmt.Println("OpenFile Err:" + err.Error())
		return ""
	}
	defer func() {
		excelFile.Close()
	}()

	commentArr := excelFile.GetComments()
	for k, v := range commentArr {
		fmt.Println(k, v)
		for _, sv := range v {
			fmt.Println("text:", sv.Text)
			if sv.Text != "" {
				return sv.Text
			}
		}
	}
	return ""
}

var pushLock sync.RWMutex
//刷新周度指标数据
func AddIndexRefreshToLpush(filePath string) {
	pushLock.Lock()
	cache.IndexAutoRefresh(filePath)
	pushLock.Unlock()
	return
}