package models

import (
	"fmt"
	"github.com/beego/beego/v2/client/orm"
	"hongze/hongze_edb_lib/services"
	"hongze/hongze_edb_lib/utils"
	"strconv"
	"strings"
	"time"
)

func AddEdbDataFromPb(edbCode string, item *services.EdbDataFromPb) (err error) {
	var errMsg string
	o := orm.NewOrm()
	defer func() {
		if err != nil {
			go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", " 同花顺数据获取失败:err:"+errMsg, utils.EmailSendToUsers)
		}
	}()

	if len(item.Date) > 0 {
		var isAdd bool
		dateMap := item.Date
		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,ticker,field,data_timestamp) values `
		nowStr := time.Now().Format(utils.FormatDateTime)
		for k, v := range dateMap {
			timeStr := fmt.Sprintf("%d", v)
			v = v / 1000
			t := time.Unix(v, 0)
			dateTime := t.Format(utils.FormatDate)

			val := item.Value[k]
			field := item.Field[k]
			ticker := item.Ticker[k]

			if field == "PX_LAST" {
				addSql += "("
				addSql += "0," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + utils.SubFloatToString(val, 20) + "," + "'" + nowStr + "'" +
					"," + "'" + nowStr + "'" + "," + "0" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
				addSql += "),"
				isAdd = true
			}
		}
		if isAdd {
			addSql = strings.TrimRight(addSql, ",")
			_, err = o.Raw(addSql).Exec()
			if err != nil {
				errMsg = " tx.Exec Err :" + err.Error()
				return
			}
		}
	}
	return
}

//刷新彭博指标数据
func RefreshEdbDataFromPb(edbInfoId int, edbCode, startDate string, item *services.EdbDataFromPb) (err error) {
	o := orm.NewOrm()
	source := utils.DATA_SOURCE_PB

	var condition string
	var pars []interface{}

	condition += " AND edb_info_id=? "
	pars = append(pars, edbInfoId)

	condition += " AND data_time>=? "
	pars = append(pars, startDate)
	existList, err := GetEdbDataByCondition(source, condition, pars)
	existMap := make(map[string]*EdbInfoSearchData)
	for _, v := range existList {
		existMap[v.DataTime] = v
	}

	edbInfoIdStr := strconv.Itoa(edbInfoId)
	addMap := make(map[string]string)
	if len(item.Date) > 0 {
		dateMap := item.Date
		var isAdd bool
		addSql := ` INSERT INTO edb_data_pb(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,ticker,field,data_timestamp) values `
		nowStr := time.Now().Format(utils.FormatDateTime)
		for k, v := range dateMap {
			timeStr := fmt.Sprintf("%d", v)
			v = v / 1000
			t := time.Unix(v, 0)
			dateTime := t.Format(utils.FormatDate)
			val := item.Value[k]
			field := item.Field[k]
			ticker := item.Ticker[k]
			saveValue := utils.SubFloatToString(val, 30)
			if field == "PX_LAST" {
				if findItem, ok := existMap[dateTime]; !ok {
					if _, addOk := addMap[dateTime]; !addOk {
						addSql += "("
						addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + dateTime + "'" + "," + saveValue + "," + "'" + nowStr + "'" +
							"," + "'" + nowStr + "'" + "," + "1" + "," + "'" + ticker + "'" + "," + "'" + field + "'" + "," + "'" + timeStr + "'"
						addSql += "),"
						isAdd = true
						addMap[dateTime] = saveValue
					}
				} else {
					if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveValue {
						err = ModifyEdbDataById(source, findItem.EdbDataId, saveValue)
						if err != nil {
							return err
						}
					}
				}
			}
		}

		if isAdd {
			addSql = strings.TrimRight(addSql, ",")
			_, err = o.Raw(addSql).Exec()
			if err != nil {
				fmt.Println("RefreshAllEdbDataByPb add Err", err.Error())
				return
			}
		}
	}
	return
}