package models

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

func AddEdbDataFromWind(edbCode string, item *services.EdbDataFromWind) (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)
			go alarm_msg.SendAlarmMsg("wind数据获取失败:err:"+errMsg, 3)
		}
	}()

	var isAdd bool
	addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
	for k, v := range item.Dt {
		timeStr := fmt.Sprintf("%d", v)
		v = v / 1000
		t := time.Unix(v, 0)
		dateTime := t.Format(utils.FormatDate)
		val := item.Close[k]
		saveVal := utils.SubFloatToString(val, 20)
		addSql += GetAddSql("0", edbCode, dateTime, timeStr, saveVal)

		isAdd = true
	}

	if isAdd {
		addSql = strings.TrimRight(addSql, ",")
		_, err = o.Raw(addSql).Exec()
		if err != nil {
			errMsg = " tx.Exec Err :" + err.Error()
			return
		}
	}
	return
}

// RefreshEdbDataFromWind 刷新wind指标数据
func RefreshEdbDataFromWind(edbInfoId int, edbCode, startDate string, item *services.EdbDataFromWind) (err error) {
	o := orm.NewOrm()
	source := utils.DATA_SOURCE_WIND

	var condition string
	var pars []interface{}

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

	var startDateTime time.Time
	if startDate != "" {
		condition += " AND data_time>=? "
		pars = append(pars, startDate)
		startDateTime, _ = time.ParseInLocation(utils.FormatDate, startDate, time.Local)
	}

	existList, err := GetEdbDataByCondition(source, condition, pars)
	existMap := make(map[string]*EdbInfoSearchData)
	for _, v := range existList {
		existMap[v.DataTime] = v
	}
	addSql := ` INSERT INTO edb_data_wind(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
	var isAdd bool
	addMap := make(map[string]string)
	edbInfoIdStr := strconv.Itoa(edbInfoId)
	for k, v := range item.Dt {
		timeStr := fmt.Sprintf("%d", v)
		v = v / 1000
		t := time.Unix(v, 0)
		dateTime := t.Format(utils.FormatDate)
		val := item.Close[k]
		saveVal := utils.SubFloatToString(val, 30)

		//如果传入的开始时间是空的，且当前数据日期早于传入的开始日期，那么需要判断下当前日期的数据是否存在
		if !startDateTime.IsZero() && t.Before(startDateTime) {
			tmpItem, tmpErr := GetEdbDataByDate(source, edbCode, dateTime)
			if tmpErr == nil && tmpItem != nil {
				existMap[tmpItem.DataTime] = tmpItem
			}
		}

		if findItem, ok := existMap[dateTime]; !ok {
			if _, existOk := addMap[dateTime]; !existOk {
				isAdd = true
				addSql += GetAddSql(edbInfoIdStr, edbCode, dateTime, timeStr, saveVal)
				addMap[dateTime] = saveVal
			}
		} else {
			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != saveVal {
				err = ModifyEdbDataById(source, findItem.EdbDataId, saveVal)
				if err != nil {
					return err
				}
			}
		}
	}
	if isAdd {
		addSql = strings.TrimRight(addSql, ",")
		_, err = o.Raw(addSql).Exec()
		if err != nil {
			fmt.Println("RefreshEdbDataFromWind add Err", err.Error())
			return
		}
	}

	return
}

type ServerUrlCountGroup struct {
	ServerUrl string
	Total     int
}

// GetServerUrlCountGroupByServerUrl 获取服务器地址分组总数
func GetServerUrlCountGroupByServerUrl() (list []ServerUrlCountGroup, err error) {
	o := orm.NewOrm()
	sql := `select server_url,count(1) total from edb_info where source = 2 and server_url != "" group by server_url; `
	_, err = o.Raw(sql).QueryRows(&list)
	return
}
