package services

import (
	"eta/eta_crawler/models"
	"eta/eta_crawler/services/alarm_msg"
	"eta/eta_crawler/utils"
	"fmt"
	"github.com/mozillazg/go-pinyin"
	"github.com/tealeg/xlsx"
	"strconv"
	"time"
)

func FileCoalInland() () {
	var err error
	defer func() {
		if err != nil {
			fmt.Println("RefreshDataFromCoalInland Err:" + err.Error())
			msg := "失败提醒" + "RefreshDataFromCoalInland ErrMsg:" + err.Error()
			go alarm_msg.SendAlarmMsg(msg, 3)
			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "RefreshDataFromCoalInland ErrMsg:"+err.Error(), utils.EmailSendToUsers)
		}
	}()
	//path := "/Users/xi/Desktop/内陆17省动力煤终端用户供耗存%s.xlsx"
	//path := "/home/code/python/coal_mail/emailFile/内陆17省动力煤终端用户供耗存%s.xlsx"
	//for i := 0;i < 7;i++{
	//	npath := fmt.Sprintf(path,time.Now().AddDate(0,0,-i).Format(utils.FormatDateUnSpace))
	//	fmt.Println(npath)
	//	exist,err := PathExists(npath)
	//	if err != nil {
	//		fmt.Println(err)
	//		return
	//	}
	//	if exist{
	//		path = npath
	//		break
	//	}
	//	if i < 3 && !exist{
	//		npath := "/home/code/python/coal_mail/emailFile/内陆17省动力煤终端用户供耗存.xlsx"
	//		//npath := "/Users/xi/Desktop/内陆17省动力煤终端用户供耗存.xlsx"
	//		fmt.Println(npath)
	//		exist,err := PathExists(npath)
	//		if err != nil {
	//			fmt.Println(err)
	//			return
	//		}
	//		if exist{
	//			path = npath
	//			break
	//		}
	//	}
	//}
	//exist,err := PathExists(path)
	//if err != nil {
	//	fmt.Println(err)
	//	return
	//}
	//if !exist{
	//	path = "/home/code/python/coal_mail/emailFile/内陆17省动力煤终端用户供耗存.xlsx"
	//}
	path := "/home/code/python/coal_mail/emailFile/内陆17省动力煤终端用户供耗存.xlsx"
	exist, err := PathExists(path)
	if err != nil {
		fmt.Println(err)
		return
	}
	var xlFile *xlsx.File
	if exist {
		xlFile, err = xlsx.OpenFile(path)
		if err != nil {
			fmt.Println("OpenFile err:", err)
			return
		}
	} else {
		return
	}

	var mappingItems []*models.BaseFromCoalmineMapping
	var indexItems []*models.BaseFromCoalmineInlandIndex
	var codeMap = make(map[string]string)
	var indexMap = make(map[string]string)
	var nameMap = make(map[int]string)
	var groupMap = make(map[int]string)
	var dataTime string
	var sheetName string
	codeList, err := models.GetBaseFromCoalmineMapping()
	if err != nil && err.Error() != utils.ErrNoRow() {
		utils.FileLog.Info("获取煤炭指标失败:", err)
		return
	}
	if len(codeList) > 0 {
		for _, v := range codeList {
			codeMap[v.IndexName] = v.IndexCode
		}
	}
	indexCompanyList, err := models.GetBaseFromCoalmineInlandIndex()
	if err != nil && err.Error() != utils.ErrNoRow() {
		utils.FileLog.Info("获取煤炭公司指标失败:", err)
		return
	}
	if len(indexCompanyList) > 0 {
		for _, v := range indexCompanyList {
			indexMap[v.IndexName+v.DataTime] = v.DealValue
		}
	}

	for _, sheet := range xlFile.Sheets {
		sheetName = sheet.Name
		fmt.Println("sheetName:", sheetName)
		var unit string
		if sheetName == "可用天数" {
			unit = "天"
		} else {
			unit = "万吨"
		}
		//遍历行读取
		maxCol := sheet.MaxCol
		for i := 0; i < maxCol; i++ {
			if i == 0 {
				row := sheet.Row(i)
				cells := row.Cells
				for k, cell := range cells {
					if k > 0 && k < 18 {
						text := cell.String()
						groupMap[k] = text
						var item models.BaseFromCoalmineMapping
						//合计命名
						if k == 9 {
							item.IndexName = sheetName
						}
						item.IndexName = text + sheetName
						nameMap[k] = item.IndexName
						//code
						exists := ContainsSpecialName(text)
						var code string
						if exists {
							abbr := trimProvinceName(text)
							//取处理后公司名首字母缩写
							a := pinyin.NewArgs()
							rows := pinyin.Pinyin(sheetName, a)
							for i := 0; i < len(rows); i++ {
								if len(rows[i]) != 0 {
									str := rows[i][0]
									pi := str[0:1]
									code += pi
								}
							}
							item.IndexCode = abbr + code + "inland"
						} else {
							a := pinyin.NewArgs()
							rows := pinyin.Pinyin(text+sheetName, a)
							for i := 0; i < len(rows); i++ {
								if len(rows[i]) != 0 {
									str := rows[i][0]
									pi := str[0:1]
									code += pi
								}
							}
							item.IndexCode = code + "inland"
						}
						item.CreateTime = time.Now()
						mappingItems = append(mappingItems, &item)
					}
				}
			}
			if i > 0 {
				row := sheet.Row(i)
				cells := row.Cells
				for k, cell := range cells {
					if k < 18 {
						var item models.BaseFromCoalmineInlandIndex
						if k == 0 {
							text := cell.String()
							t, _ := time.ParseInLocation("01-02-06", text, time.Local)
							dataTime = t.Format(utils.FormatDate)
							if len(text) < 6 {
								dataTime = ExcelDateToDate(text).Format(utils.FormatDate)
							}
						}
						if k > 0 {
							text := cell.String()
							item.IndexName = nameMap[k]
							item.IndexCode = codeMap[nameMap[k]]
							item.DealValue = text
							item.GroupName = groupMap[k]
							item.Source = "内陆十七省"
							item.DataTime = dataTime
							item.Unit = unit
							item.Frequency = "日度"
							item.ModifyTime = time.Now()
							item.CreateTime = time.Now()
						}
						indexItems = append(indexItems, &item)
					}
				}
			}
		}
	}
	//添加数据到数据库
	for _, v := range mappingItems {
		if codeMap[v.IndexName] == "" {
			codeMap[v.IndexName] = v.IndexCode
			newId, err := models.AddBaseFromCoalmineMapping(v)
			if err != nil {
				for i := 0; i < 10; i++ {
					v.IndexCode = v.IndexCode + strconv.Itoa(i)
					codeMap[v.IndexName] = v.IndexCode
					newId, err := models.AddBaseFromCoalmineMapping(v)
					if err != nil {
						fmt.Println("再次添加公司指标名称错误", err)
						continue
					} else {
						fmt.Println("新增公司成功", newId)
						break
					}
				}
			} else {
				fmt.Println("新增公司成功", newId)
			}
		}
	}
	fmt.Println("指标操作完成")

	//给indexItem中的code赋值并插入index表
	for _, v := range indexItems {
		v.IndexCode = codeMap[v.IndexName]
		if indexMap[v.IndexName+v.DataTime] == "" && v.DealValue != "" {
			newId, err := models.AddBaseFromCoalInlandIndex(v)
			if err != nil {
				fmt.Println("添加数据错误", err)
			} else {
				fmt.Println("新增成功", newId)
			}
		} else {
			if indexMap[v.IndexName+v.DataTime] != v.DealValue && v.DealValue != "" {
				err = models.UpdateBaseFromCoalInlandIndex(v)
				if err != nil {
					fmt.Println("修改数据错误错误", err)
					return
				}
			}
		}
	}
	return
}