package data

import (
	"encoding/json"
	"eta/eta_task/models"
	"eta/eta_task/models/data_manage"
	"eta/eta_task/services/alarm_msg"
	"eta/eta_task/utils"
	"fmt"
)

// RefreshFactorEdbCalculateData 刷新因子指标计算数据
func RefreshFactorEdbCalculateData() (err error) {
	defer func() {
		if err != nil {
			tips := fmt.Sprintf("RefreshFactorEdbCalculateData ErrMsg: %v", err)
			utils.FileLog.Info(tips)
			go alarm_msg.SendAlarmMsg(tips, 3)
		}
	}()

	mappingOb := new(data_manage.FactorEdbSeriesMapping)
	list, e := mappingOb.GetItemsByCondition(``, make([]interface{}, 0), []string{fmt.Sprintf("DISTINCT %s", mappingOb.Cols().EdbInfoId), mappingOb.Cols().EdbCode}, "")
	if e != nil {
		err = fmt.Errorf("获取系列因子指标失败, err: %v", e)
		return
	}
	if len(list) == 0 {
		return
	}

	for _, v := range list {
		_, e = PostRefreshFactorEdbRecalculate(v.EdbInfoId, v.EdbCode)
		if e != nil {
			utils.FileLog.Info(fmt.Sprintf("PostRefreshFactorEdbRecalculate err, EdbInfoId: %d, err: %v", v.EdbInfoId, e))
			continue
		}
	}
	return
}

// RefreshFactorEdbChartCalculateData 刷新因子指标图表计算数据
func RefreshFactorEdbChartCalculateData() (err error) {
	defer func() {
		if err != nil {
			tips := fmt.Sprintf("RefreshFactorEdbChartCalculateData ErrMsg: %v", err)
			utils.FileLog.Info(tips)
			go alarm_msg.SendAlarmMsg(tips, 3)
		}
	}()

	mappingOb := new(data_manage.FactorEdbSeriesChartMapping)
	list, e := mappingOb.GetItemsByCondition(``, make([]interface{}, 0), []string{fmt.Sprintf("DISTINCT %s", mappingOb.Cols().ChartInfoId)}, "")
	if e != nil {
		err = fmt.Errorf("获取指标系列关联图表失败, err: %v", e)
		return
	}
	if len(list) == 0 {
		return
	}

	for _, v := range list {
		_, e = PostRefreshFactorEdbChartRecalculate(v.ChartInfoId)
		if e != nil {
			utils.FileLog.Info(fmt.Sprintf("PostRefreshFactorEdbChartRecalculate err, ChartInfoId: %d, err: %v", v.ChartInfoId, e))
			continue
		}
	}
	return
}

// PostRefreshFactorEdbRecalculate 因子指标重计算
func PostRefreshFactorEdbRecalculate(edbInfoId int, edbCode string) (resp *models.BaseResponse, err error) {
	param := make(map[string]interface{})
	param["EdbInfoId"] = edbInfoId
	param["EdbCode"] = edbCode
	postUrl := fmt.Sprintf("%s%s", utils.EDB_LIB_URL, "factor_edb_series/recalculate")
	postData, e := json.Marshal(param)
	if e != nil {
		err = fmt.Errorf("param json err: %v", e)
		return
	}
	result, e := HttpPost(postUrl, string(postData), "application/json")
	if e != nil {
		err = fmt.Errorf("http post err: %v", e)
		return
	}
	utils.FileLog.Info("PostRefreshFactorEdbRecalculate:" + postUrl + ";" + string(postData) + ";result:" + string(result))
	if e = json.Unmarshal(result, &resp); e != nil {
		err = fmt.Errorf("resp unmarshal err: %v", e)
		return
	}
	return
}

// PostRefreshFactorEdbChartRecalculate 因子指标图表重计算
func PostRefreshFactorEdbChartRecalculate(chartInfoId int) (resp *models.BaseResponse, err error) {
	param := make(map[string]interface{})
	param["ChartInfoId"] = chartInfoId
	postUrl := fmt.Sprintf("%s%s", utils.EDB_LIB_URL, "factor_edb_series/chart_recalculate")
	postData, e := json.Marshal(param)
	if e != nil {
		err = fmt.Errorf("param json err: %v", e)
		return
	}
	result, e := HttpPost(postUrl, string(postData), "application/json")
	if e != nil {
		err = fmt.Errorf("http post err: %v", e)
		return
	}
	utils.FileLog.Info("PostRefreshFactorEdbChartRecalculate:" + postUrl + ";" + string(postData) + ";result:" + string(result))
	if e = json.Unmarshal(result, &resp); e != nil {
		err = fmt.Errorf("resp unmarshal err: %v", e)
		return
	}
	return
}