package core

import (
	"encoding/json"
	"fmt"
	"reflect"
	"strconv"
	"time"
)

type TickerInfo struct {
	Id         string    `json:"_id"`
	InstID     string    `json:"instID"`
	Last       float64   `json:"last"`
	LastUpdate time.Time `json:"lastUpdate"`
	InstType   string    `json:"instType"`
	VolCcy24h  float64   `json:"volCcy24h"`
	Ts         int64     `json:"ts"`
}

type TickerInfoResp struct {
	InstID    string `json:"instID"`
	Last      string `json:"last"`
	InstType  string `json:"instType"`
	VolCcy24h string `json:"volCcy24h"`
	Ts        string `json:"ts"`
}

func (tir *TickerInfoResp) Convert() TickerInfo {
	ti := TickerInfo{
		Id:         HashString(tir.InstID + tir.Ts),
		InstID:     tir.InstID,
		InstType:   tir.InstType,
		Last:       ToFloat64(tir.Last),
		VolCcy24h:  ToFloat64(tir.VolCcy24h),
		Ts:         ToInt64(tir.Ts),
		LastUpdate: time.Now(),
	}
	return ti
}

func ToString(val interface{}) string {
	valstr := ""
	if reflect.TypeOf(val).Name() == "string" {
		valstr = val.(string)
	} else if reflect.TypeOf(val).Name() == "float64" {
		valstr = fmt.Sprintf("%f", val)
	} else if reflect.TypeOf(val).Name() == "int64" {
		valstr = strconv.FormatInt(val.(int64), 16)
	} else if reflect.TypeOf(val).Name() == "int" {
		valstr = fmt.Sprintf("%d", val)
	}
	return valstr
}

func ToInt64(val interface{}) int64 {
	vali := int64(0)
	if reflect.TypeOf(val).Name() == "string" {
		vali, _ = strconv.ParseInt(val.(string), 10, 64)
	} else if reflect.TypeOf(val).Name() == "float64" {
		vali = int64(val.(float64))
	}
	return vali
}

func ToFloat64(val interface{}) float64 {
	valf := float64(0)
	if reflect.TypeOf(val).Name() == "string" {
		valf, _ = strconv.ParseFloat(val.(string), 64)
	} else if reflect.TypeOf(val).Name() == "float64" {
		valf = val.(float64)
	} else if reflect.TypeOf(val).Name() == "int64" {
		valf = float64(val.(int64))
	}
	return valf
}

// TODO 有待实现
func (ti *TickerInfo) SetToKey(cr *Core) error {
	js, _ := json.Marshal(*ti)
	plateName := ti.InstID + "|tickerInfo"
	_, err := cr.RedisLocalCli.Set(plateName, string(js), 0).Result()
	return err
}