package services

import (
	"encoding/json"
	"errors"
	"fmt"
	"github.com/tealeg/xlsx"
	"hongze/hongze_task/models"
	"hongze/hongze_task/utils"
	"net/url"
	"os"
	"path/filepath"
	"rdluck_tools/http"
	"strconv"
	"time"
)

//获取隆众信息表中指标
func GetLongZhongTargetInfoByExcel() {
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err:" + err.Error())
			go utils.SendEmail("获取隆众指标信息失败"+time.Now().Format("2006-01-02 15:04:05"), ";Err:"+err.Error(), utils.EmailSendToUsers)
			return
		}
	}()

	excelPath := `./static/longzhong_0824.xlsx`
	file, err := xlsx.OpenFile(excelPath)
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}
	sheets := file.Sheets
	for k, v := range sheets {
		fmt.Println(k, v.Name)
		classify, err := models.GetEdbdataClassifyByClassifyName(v.Name)
		if err != nil {
			if err.Error() == utils.ErrNoRow() {
				err = errors.New("分类不存在:Err:" + err.Error())
			} else {
				err = err
			}
			return
		}
		if classify == nil {
			err = errors.New("分类不存在,请重新核对")
			return
		}

		classifyId := classify.ClassifyId
		classifyName := classify.ClassifyName
		fmt.Println(classifyId, classifyName)
		maxRow := v.MaxRow
		//maxCol := v.MaxCol
		fmt.Println(classifyName, maxRow)
		for i := 0; i < maxRow; i++ {
			row, err := v.Row(i)
			if err != nil {
				return
			}
			longzhongClassify := ""
			if i > 0 {
				longzhongClassifyNew := row.GetCell(0).String()
				if longzhongClassifyNew != "" {
					longzhongClassify = longzhongClassifyNew
				}
				secName := row.GetCell(1).Value
				frequency := row.GetCell(2).Value
				LongzhongId := row.GetCell(3).Value
				remark := row.GetCell(4).String()
				item := new(models.DataSourceLongzhong)
				item.ClassifyId = classifyId
				item.ClassifyName = classifyName
				item.SecName = secName
				item.Frequency = frequency
				item.LongzhongId = LongzhongId
				item.Remark = remark
				item.LongzhongClassify = longzhongClassify
				_, err = models.AddDataSourceLongzhong(item)
				if err != nil {
					fmt.Println("Err:", err.Error())
					return
				}
			}
		}
	}
}

func GetLzProductList() (err error) {
	utils.FileLog.Info("start GetLzProductList")
	defer func() {
		if err != nil {
			fmt.Println("Err:" + err.Error())
			go utils.SendEmail("获取隆众指标数据失败"+time.Now().Format("2006-01-02 15:04:05"), ";Err:"+err.Error(), utils.EmailSendToUsers)
		}
	}()
	postUrl := `http://info.oilchem.net/cust/interfacenew/getProductUnitListNew`
	username := "hzmd"
	password := "HZMD2020"
	timestamp := fmt.Sprintf("%d", time.Now().Unix())
	fmt.Println(timestamp)
	token := utils.MD5(username + timestamp + utils.MD5(password))
	fmt.Println("token:", token)

	param := url.Values{}
	param.Add("username", username)
	param.Add("password", password)
	param.Add("timestamp", timestamp)
	param.Add("token", token)
	utils.FileLog.Info("%s", param.Encode())
	body, err := http.Post(postUrl, param.Encode())
	if err != nil {
		fmt.Println("err:", err.Error())
		return
	}
	result := string(body)
	if result == "" {
		err = errors.New("返回内容为空")
		return
	}
	resp := new(models.LzProductInfoResp)
	err = json.Unmarshal(body, &resp)
	if err != nil {
		fmt.Println("json.Unmarshal Err:" + err.Error())
		return
	}
	if resp.Code != "1" {
		fmt.Println("获取信息失败")
		err = errors.New("Code:" + resp.Code + ";Msg:" + resp.Msg)
		return
	}
	fmt.Println("len")
	fmt.Println(len(resp.Data))
	for _, v := range resp.Data {
		fmt.Println(v.Unitid, v.ProName, v.ProUnitName)
		var classifyId int
		var classifyName string
		classify, err := models.GetEdbdataClassifyByClassifyName(v.ProName)
		if err != nil && err.Error() != utils.ErrNoRow() {
			fmt.Println("获取分类失败,Err:" + err.Error())
			return err
		}
		if classify == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
			classifyItem := new(models.EdbdataClassify)
			classifyItem.ClassifyName = v.ProName
			classifyItem.ParentId = 4
			classifyItem.CreateTime = time.Now()
			newId, err := models.AddEdbdataClassify(classifyItem)
			if err != nil {
				fmt.Println("新增分类失败,Err:" + err.Error())
				return err
			}
			classifyId = int(newId)
			classifyName = v.ProName
		} else {
			classifyId = classify.ClassifyId
			classifyName = classify.ClassifyName
		}
		count, err := models.GetLongzhonginfoCount(classifyId, v.Unitid)
		if err != nil {
			fmt.Println("判断指标是否存在失败,Err:" + err.Error())
			return err
		}
		if count > 0 { //修改
			lzProduct := new(models.Longzhonginfo)
			lzProduct.SecName = v.ProUnitName
			lzProduct.Frequency = v.LzType
			lzProduct.ClassifyId = classifyId
			lzProduct.ClassifyName = classifyName
			lzProduct.Unit = v.Unit
			lzProduct.CreateTime = time.Now()
			if v.IsNormal == "" {
				v.IsNormal = "1"
			}
			lzProduct.IsNormal = v.IsNormal
			lzProduct.LastModifyDate = v.Maxdate
			lzProduct.Unitid = v.Unitid
			lzProduct.TempId = v.Tempid
			lzProduct.TempName = v.TempName
			lzProduct.ModifyTime = time.Now()
			err = models.ModifyLongzhonginfo(lzProduct)
			if err != nil {
				fmt.Println("修改失败,Err:" + err.Error())
				return err
			}
		} else { //新增
			maxId, err := models.GetLongzhonginfoMaxId()
			if err != nil {
				fmt.Println("获取编码失败,err:" + err.Error())
				return err
			}
			tradeCode := fmt.Sprintf("L%06d", maxId+1)
			lzProduct := new(models.Longzhonginfo)
			lzProduct.TradeCode = tradeCode
			lzProduct.SecName = v.ProUnitName
			lzProduct.Frequency = v.LzType
			lzProduct.ClassifyId = classifyId
			lzProduct.ClassifyName = classifyName
			lzProduct.Unit = v.Unit
			lzProduct.CreateTime = time.Now()
			if v.IsNormal == "" {
				v.IsNormal = "1"
			}
			lzProduct.IsNormal = v.IsNormal
			lzProduct.LastModifyDate = v.Maxdate
			lzProduct.Unitid = v.Unitid
			lzProduct.TempId = v.Tempid
			lzProduct.TempName = v.TempName
			lzProduct.ModifyTime = time.Now()
			_, err = models.AddLongzhonginfo(lzProduct)
			if err != nil {
				fmt.Println("新增指标信息失败")
				return err
			}
		}
	}
	return
}

func GetLzProductDetail() (err error) {
	utils.FileLog.Info("start GetLzProductDetail")
	defer func() {
		if err != nil {
			fmt.Println("Err:" + err.Error())
		}
	}()

	startDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
	endDate := time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
	time.Sleep(5 * time.Second)
	pageSize := 30

	postUrl := `http://info.oilchem.net/cust/interfacenew/getProductUnitDetailNew`
	username := "hzmd"
	password := "HZMD2020"

	totalPage := 10
	for i := 1; i <= totalPage; i++ {
		fmt.Println("page:", i)
		timestamp := fmt.Sprintf("%d", time.Now().Unix())
		token := utils.MD5(username + timestamp + utils.MD5(password))

		param := url.Values{}
		param.Add("username", username)
		param.Add("password", password)
		param.Add("timestamp", timestamp)
		param.Add("token", token)
		//param.Add("id", "334")
		param.Add("startDate", startDate)
		param.Add("endDate", endDate)
		param.Add("pagesize", strconv.Itoa(pageSize))
		param.Add("page", strconv.Itoa(i))
		utils.FileLog.Info("%s", param.Encode())
		body, err := http.Post(postUrl, param.Encode())
		if err != nil {
			fmt.Println("err:", err.Error())
			return err
		}
		utils.FileLog.Info("%s", string(body))
		resp := new(models.LzProductInfoDetailResp)
		err = json.Unmarshal(body, &resp)
		if err != nil {
			fmt.Println("Unmarshal Err:" + err.Error())
			return err
		}
		if resp.Code != "1" {
			fmt.Println("获取信息失败")
			err = errors.New("Code:" + resp.Code + ";Msg:" + resp.Msg)
			return err
		}
		if i == totalPage && resp.Pagesize >= pageSize {
			totalPage = totalPage + 5
		}
		for k, v := range resp.Data {
			fmt.Println(k, v.UnitId, v.ProCnName)
			target, err := models.GetLongzhonginfoByUnitId(v.ProCnName, v.UnitId)
			if err != nil {
				if err.Error() != utils.ErrNoRow() {
					fmt.Println("获取target失败,err:" + err.Error())
					continue
				}
				fmt.Println("err:" + err.Error())
				return err
			}
			if target == nil {
				fmt.Println("target is empty:"+v.ProCnName, v.UnitId)
				continue
			}

			count, err := models.GetLongzhongdataCount(target.LongzhonginfoId, v.DataTime)
			if err != nil {
				fmt.Println("GetLongzhongdataCount Err:" + err.Error())
				return err
			}
			if count > 0 {
				lzdetail := new(models.Longzhongdata)
				lzdetail.CreateTime = time.Now()
				lzdetail.ModifyTime = time.Now()
				lzdetail.TradeCode = target.TradeCode
				lzdetail.LongzhonginfoId = target.LongzhonginfoId
				lzdetail.Dt = v.DataTime
				lzdetail.Close = v.UnitValue
				lzdetail.UnitDesc = v.UnitDesc
				lzdetail.UpdTime = v.UpdTime
				err = models.ModifyLongzhongdata(lzdetail)
				if err != nil {
					fmt.Println("ModifyLongzhongdata Err:" + err.Error())
					return err
				}
			} else {
				lzdetail := new(models.Longzhongdata)
				lzdetail.CreateTime = time.Now()
				lzdetail.ModifyTime = time.Now()
				lzdetail.TradeCode = target.TradeCode
				lzdetail.LongzhonginfoId = target.LongzhonginfoId
				lzdetail.Dt = v.DataTime
				lzdetail.Close = v.UnitValue
				lzdetail.UnitDesc = v.UnitDesc
				lzdetail.UpdTime = v.UpdTime
				err = models.AddLongzhongdata(lzdetail)
				if err != nil {
					fmt.Println("AddLongzhongdata Err:" + err.Error())
					return err
				}
			}
		}
		if resp.Pagesize < pageSize || len(resp.Data) == 0 {
			return err
		}
		time.Sleep(2 * time.Second)
	}
	return
}

//获取历史隆众数据
func GetHistoryLzProductDetail() (err error) {
	utils.FileLog.Info("start GetHistoryLzProductDetail")
	var msg string
	defer func() {
		if err != nil {
			fmt.Println("Err:" + err.Error())
		}
		if msg != "" {
			fmt.Println("msg:" + msg)
		}
	}()

	infoList, err := models.GetLongzhonginfoList()
	if err != nil {
		msg = "获取指标列表失败,Err:" + err.Error()
		return
	}

	for ik, iv := range infoList {
		fmt.Println(ik, iv.SecName)
		startDate := "2017-01-01" //time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
		endDate := "2017-12-31"   //time.Now().AddDate(0, 0, 0).Format(utils.FormatDate)
		time.Sleep(5 * time.Second)
		pageSize := 30

		postUrl := `http://info.oilchem.net/cust/interfacenew/getProductUnitDetailNew`
		username := "hzmd"
		password := "HZMD2020"

		totalPage := 10
		for i := 1; i <= totalPage; i++ {
			fmt.Println("page:", i)
			timestamp := fmt.Sprintf("%d", time.Now().Unix())
			token := utils.MD5(username + timestamp + utils.MD5(password))

			param := url.Values{}
			param.Add("username", username)
			param.Add("password", password)
			param.Add("timestamp", timestamp)
			param.Add("token", token)
			param.Add("id", strconv.Itoa(iv.Unitid))
			param.Add("startDate", startDate)
			param.Add("endDate", endDate)
			if i > 1 {
				param.Add("page", strconv.Itoa(i))
			}
			param.Add("pagesize", strconv.Itoa(pageSize))
			utils.FileLog.Info("%s", param.Encode())
			fmt.Println("post url:", postUrl)
			fmt.Println("post params:", param.Encode())
			body, err := http.Post(postUrl, param.Encode())
			if err != nil {
				fmt.Println("err:", err.Error())
				return err
			}
			utils.FileLog.Info("%s", string(body))
			fmt.Println("body:", string(body))
			resp := new(models.LzProductInfoDetailResp)
			err = json.Unmarshal(body, &resp)
			if err != nil {
				fmt.Println("Unmarshal Err:" + err.Error())
				fmt.Println("body:", string(body))
				return err
			}
			if resp.Code != "1" {
				fmt.Println("获取信息失败")
				err = errors.New("Code:" + resp.Code + ";Msg:" + resp.Msg)
				return err
			}
			if i == totalPage && resp.Pagesize >= pageSize {
				totalPage = totalPage + 5
			}
			for k, v := range resp.Data {
				fmt.Println(k, v.UnitId, v.ProCnName)
				target, err := models.GetLongzhonginfoByUnitId(v.ProCnName, v.UnitId)
				if err != nil {
					if err.Error() != utils.ErrNoRow() {
						fmt.Println("获取target失败,err:" + err.Error())
						continue
					}
					fmt.Println("err:" + err.Error())
					return err
				}
				if target == nil {
					fmt.Println("target is empty:"+v.ProCnName, v.UnitId)
					continue
				}

				count, err := models.GetLongzhongdataCount(target.LongzhonginfoId, v.DataTime)
				if err != nil {
					fmt.Println("GetLongzhongdataCount Err:" + err.Error())
					return err
				}
				if count > 0 {
					fmt.Println("数据已存在:", iv.Unitid, iv.SecName, v.UnitValue, v.DataTime)
					/*lzdetail := new(models.Longzhongdata)
					lzdetail.CreateTime = time.Now()
					lzdetail.ModifyTime = time.Now()
					lzdetail.TradeCode = target.TradeCode
					lzdetail.LongzhonginfoId = target.LongzhonginfoId
					lzdetail.Dt = v.DataTime
					lzdetail.Close = v.UnitValue
					lzdetail.UnitDesc = v.UnitDesc
					lzdetail.UpdTime = v.UpdTime
					err = models.ModifyLongzhongdata(lzdetail)
					if err != nil {
						fmt.Println("ModifyLongzhongdata Err:" + err.Error())
						return err
					}*/
				} else {
					lzdetail := new(models.Longzhongdata)
					lzdetail.CreateTime = time.Now()
					lzdetail.ModifyTime = time.Now()
					lzdetail.TradeCode = target.TradeCode
					lzdetail.LongzhonginfoId = target.LongzhonginfoId
					lzdetail.Dt = v.DataTime
					lzdetail.Close = v.UnitValue
					lzdetail.UnitDesc = v.UnitDesc
					lzdetail.UpdTime = v.UpdTime
					err = models.AddLongzhongdata(lzdetail)
					if err != nil {
						fmt.Println("AddLongzhongdata Err:" + err.Error())
						return err
					}
				}
			}
			if resp.Pagesize < pageSize || len(resp.Data) == 0 {
				break
			}
			if i == 1 && len(resp.Data) == 0 {
				utils.FileLog.Info("%d", iv.Unitid)
			}
			time.Sleep(2 * time.Second)
		}
		err = models.ModifyLongzhonginfoIsNormal(iv.LongzhonginfoId)
		if err != nil {
			fmt.Println("ModifyLongzhonginfoIsNormal:Err" + err.Error())
		}
		fmt.Println("sleep", iv.SecName)
		time.Sleep(2 * time.Second)
	}
	return
}

func GetLzPrice() {
	fmt.Println("start")
	/*getUrl:=`https://openapi.oilchem.net/price/getProduct?password=HZMD2020&type=guoji&username=hzmd`
	result,err:=http.Get(getUrl)
	fmt.Println(string(result),err)
	utils.FileLog.Info("%s",string(result))*/

	getUrl := `https://openapi.oilchem.net/price/getPrice?password=HZMD2020&type=guoji&username=hzmd&inStartDate=2020-08-20&inEndDate=2020-08-26`
	result, err := http.Get(getUrl)
	fmt.Println(string(result), err)
	utils.FileLog.Info("%s", string(result))

	fmt.Println("end")
}

func LzExportExcel() {
	var err error
	defer func() {
		if err != nil {
			fmt.Println("err:" + err.Error())
		}
	}()
	parentId := 4
	classifyList, err := models.GetEdbdataClassifyByParentId(parentId)
	if err != nil {
		return
	}
	xlsxFile := xlsx.NewFile()
	if err != nil {
		fmt.Println("生成文件失败" + err.Error())
		return
	}
	dir, _ := os.Executable()
	exPath := filepath.Dir(dir)
	downLoadnFilePath := exPath + "/static/" + time.Now().Format(utils.FormatDateTimeUnSpace) + ".xlsx"
	fmt.Println("downLoadnFilePath")
	fmt.Println(downLoadnFilePath)
	for _, v := range classifyList {
		fmt.Println(v.ClassifyId, v.ClassifyName)
		//获取指标
		secNameList, err := models.GetLongzhonginfoByClassifyId(v.ClassifyId)
		if err != nil {
			fmt.Println("获取数据失败,Err:" + err.Error())
			return
		}
		if len(secNameList) <= 0 {
			continue
		}
		sheetNew, err := xlsxFile.AddSheet(v.ClassifyName)
		if err != nil {
			fmt.Println("新增Sheet失败", err.Error())
			return
		}
		//获取指标数据
		windRow := sheetNew.AddRow()
		secNameRow := sheetNew.AddRow()
		frequencyRow := sheetNew.AddRow()
		unitRow := sheetNew.AddRow()
		lastModifyDateRow := sheetNew.AddRow()
		//获取分类下指标最大数据量
		dataMax, err := models.GetLongzhongDataMaxCount(v.ClassifyId)
		if err != nil {
			fmt.Println("获取指标最大数据量失败", err.Error())
			return
		}
		for _, sv := range secNameList {
			fmt.Println("line 399:", v.ClassifyId, v.ClassifyName, sv.SecName, sv.Frequency)

			windRow.AddCell().SetValue("Wind")
			secNameRow.AddCell().SetValue("指标名称")
			frequencyRow.AddCell().SetValue("频率")
			unitRow.AddCell().SetValue("单位")
			lastModifyDateRow.AddCell().SetValue("更新时间")

			secNameRow.AddCell().SetValue(sv.SecName)
			frequencyRow.AddCell().SetValue(sv.Frequency)
			unitRow.AddCell().SetValue(sv.Unit)
			lastModifyDateRow.AddCell().SetValue(sv.LastModifyDate)

			windRow.AddCell()
			windRow.AddCell()
			secNameRow.AddCell()
			frequencyRow.AddCell()
			unitRow.AddCell()
			lastModifyDateRow.AddCell()

			//获取数据
			dataList, err := models.GetLongzhongDataById(sv.LongzhonginfoId)
			if err != nil {
				fmt.Println("GetLongzhongDataById Err:" + err.Error())
				return
			}
			if len(dataList) <= 0 {
				for n := 0; n < dataMax; n++ {
					rowIndex := 5 + n
					row, err := sheetNew.Row(rowIndex)
					if err != nil {
						fmt.Println("add row err:" + err.Error())
						return
					}
					row.AddCell()
					row.AddCell()
					row.AddCell()
				}
			} else {
				for rk, dv := range dataList {
					rowIndex := 5 + rk
					row, err := sheetNew.Row(rowIndex)
					if err != nil {
						fmt.Println("add row err:" + err.Error())
						return
					}
					row.AddCell().SetValue(dv.Dt)
					row.AddCell().SetFloat(dv.Close)
					row.AddCell()
				}
			}
		}
		err = xlsxFile.Save(downLoadnFilePath)
		if err != nil {
			return
		}
	}
}