package services

import (
	"encoding/json"
	"errors"
	"eta/eta_index_lib/models"
	"fmt"
	"reflect"
	"strings"
)

// getEdbDataFromThsDsHttp 通过url获取同花顺的日期序列数据
func getEdbDataFromThsDsHttp(stockCode, edbCode, startDate, endDate, thsRefreshToken, token string) (item models.EdbDataFromThs, err error) {
	thsUrl := "https://quantapi.51ifind.com/api/v1/date_sequence"
	//indicators 是 半角逗号分隔的所有指标，宏观指标过多，推荐使用Windows超级命令生成。 "indicators":"M001620326,M002822183"
	//functionpara 否 key-value格式,省略时不进行更新时间筛选。两个时间控件更新起始时间（startrtime）和更新结束时间（endrtime），不勾选时省略见下方代码块
	//startdate 是 开始日期，支持”YYYYMMDD"”YYYY-MM-DD"”YYYY/MM/DD"三种时间格式 "startdate":"2018-01-01"
	//enddate 是 结束日期，支持”YYYYMMDD"”YYYY-MM-DD"”YYYY/MM/DD"三种日期格式 "enddate":"2018-01-01
	//发送创建请求
	// 分割字符串
	paramList := strings.Split(edbCode, ",")

	// 创建一个包含映射的切片
	var indipara []map[string]interface{}

	// 遍历分割后的参数列表
	for _, param := range paramList {
		// 创建一个映射
		paramMap := map[string]interface{}{
			"indicator": param,
		}

		// 将映射添加到切片中
		indipara = append(indipara, paramMap)
	}
	dataMap := map[string]interface{}{
		"codes":     stockCode,
		"startdate": startDate,
		"enddate":   endDate,
		"indipara":  indipara,
	}

	body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
	if err != nil {
		return
	}

	tmpItems := new(EdbDataFromThsSdInterface)
	err = json.Unmarshal(body, &tmpItems)
	if err != nil {
		err = errors.New("GetEdbDataFromThs json.Unmarshal Err:" + err.Error())
		return
	}
	if tmpItems.Errorcode != 0 {
		err = errors.New(tmpItems.Errmsg)
		return
	}

	// 请求的字段名
	edbCodeList := strings.Split(edbCode, ",")

	// 遍历请求的字段，并从 map 中获取对应的结构体字段
	// 证券代码为多个时有多个table,目前只有一个
	tablesList := make([]models.Tables, 0)
	tableTimeList := make([]string, 0)
	if len(tmpItems.Tables) > 0 {
		//for _, time := range tmpItems.Tables[0].Time{
		//	tableTimeList = append(tableTimeList, time)
		//}
		for _, field := range edbCodeList {
			tableValueList := make([]float64, 0)

			if values, ok := tmpItems.Tables[0].Table[field]; ok {
				// 在这里，value 是一个接口类型，需要使用反射获取切片的值
				sliceValue := reflect.ValueOf(values)
				for i := 0; i < sliceValue.Len(); i++ {
					fmt.Printf("%s: %v\n", field, sliceValue.Index(i).Interface())

					var tableValue float64
					value := reflect.ValueOf(sliceValue.Index(i).Interface())
					if value.Kind() == reflect.Float64 {
						tableValue = value.Float()
						tableTimeList = append(tableTimeList, tmpItems.Tables[0].Time[i])
						tableValueList = append(tableValueList, tableValue)
					}
				}
			} else {
				fmt.Printf("Field '%s' not found\n", field)
			}
			tmpTable := models.Tables{
				ID:    []string{},
				Time:  tableTimeList,
				Value: tableValueList,
			}
			tablesList = append(tablesList, tmpTable)
		}

		//// 因为table里面的value有的时候返回的是string,有的是float64，所以需要用interface来反射取值
		//tablesList := make([]models.Tables, 0)
		//for _, table := range tmpItems.Tables[0].Time {
		//	//tableCodeList := make([]string, 0)
		//	tableTimeList := make([]string, 0)
		//	tableValueList := make([]float64, 0)
		//
		//	//for _, code := range table.Thscode {
		//	//	tableCodeList = append(tableCodeList, code)
		//	//}
		//	for _, tableTime := range table {
		//		tableTimeList = append(tableTimeList, tableTime)
		//	}
		//
		//	//指标数据
		//	for _, tmpValue := range table {
		//		var tableValue float64
		//		if reflect.TypeOf(tmpValue).Kind() == reflect.Float64 {
		//			tableValue = reflect.ValueOf(tmpValue).Float()
		//		} else if reflect.TypeOf(tmpValue).Kind() == reflect.String {
		//			tmpTableValue, tmpErr := decimal.NewFromString(reflect.ValueOf(tmpValue).String())
		//			if tmpErr != nil {
		//				err = tmpErr
		//				return
		//			}
		//			tableValue, _ = tmpTableValue.Truncate(4).Float64()
		//		} else {
		//			err = errors.New("错误的数据类型" + reflect.TypeOf(tmpValue).String())
		//			return
		//		}
		//		tableValueList = append(tableValueList, tableValue)
		//	}
		//	tmpTable := models.Tables{
		//		ID:    []string{},
		//		Time:  tableTimeList,
		//		Value: tableValueList,
		//	}
		//	tablesList = append(tablesList, tmpTable)
		//}
	}

	item = models.EdbDataFromThs{
		DataVol:   int64(tmpItems.DataVol),
		Errmsg:    tmpItems.Errmsg,
		Errorcode: int64(tmpItems.Errorcode),
		Perf:      tmpItems.Perf,
		Tables:    tablesList,
	}
	return
}

// getFutureGoodDataFromThsHttp 通过url获取同花顺的商品数据
//func getFutureGoodDataFromThsHttp(edbCode, startDate, endDate, thsRefreshToken, token string) (item future_good.FutureGoodDataFromThs, err error) {
//	thsUrl := `https://quantapi.51ifind.com/api/v1/cmd_history_quotation`
//
//	//codes 是 半角逗号分隔的所有代码 "codes":"300033.SZ,600030.SH"
//	//indicators 是 半角逗号分隔的所有指标 "indicators":"preClose,open"
//	//functionpara 否 /key-value格式。所有key均取默认时，functionpara省略。 见下方说明
//	//startdate 是 开始日期，支持"YYYYMMDD""YYYY-MMDD""YYYY/MM/DD"三种日期格式
//	//"startdate":"2018-01-01"
//	//enddate 是 结束日期，支持"YYYYMMDD""YYYY-MMDD""YYYY/MM/DD"三种日期格式
//	//发送创建请求
//	dataMap := map[string]interface{}{
//		"codes":      edbCode,
//		"indicators": `lastclose,open,high,low,close,avgprice,change,changeper,volume,amount,hsl,lastsettlement,settlement,zdsettlement,zdfsettlement,ccl,ccbd,zf,zjlx,zjcd`,
//		"startdate":  startDate,
//		"enddate":    endDate,
//	}
//
//	body, err, _ := postCurl(thsUrl, dataMap, 0, thsRefreshToken, token)
//	if err != nil {
//		return
//	}
//
//	tmpItems := new(FutureGoodDataFromThsInterface)
//	err = json.Unmarshal(body, &tmpItems)
//	if err != nil {
//		err = errors.New("GetEdbDataFromThs json.Unmarshal Err:" + err.Error())
//		return
//	}
//	if tmpItems.Errorcode != 0 {
//		err = errors.New(tmpItems.Errmsg)
//		return
//	}
//
//	if len(tmpItems.Tables) <= 0 {
//		return
//	}
//	table := tmpItems.Tables[0]
//	item = future_good.FutureGoodDataFromThs{
//		DataVol:   tmpItems.DataVol,
//		Errmsg:    tmpItems.Errmsg,
//		Errorcode: tmpItems.Errorcode,
//		Perf:      tmpItems.Perf,
//		Tables: future_good.FutureGoodDataTables{
//			Time:       table.Time,
//			Open:       table.Table.Open,
//			High:       table.Table.High,
//			Low:        table.Table.Low,
//			Close:      table.Table.Close,
//			Volume:     table.Table.Volume,
//			Amount:     table.Table.Amount,
//			Ccl:        table.Table.Ccl,
//			Settlement: table.Table.Settlement,
//		},
//	}
//	return
//}
