package common

import (
	"encoding/json"
	"errors"
	"reflect"
	"sort"
)

//hotime的常用map
type Map map[string]interface{}

//获取string
func (that Map) GetString(key string, err ...*Error) string {

	if len(err) != 0 {
		err[0].SetError(nil)
	}
	return ObjToStr((that)[key])

}

func (that *Map) Pointer() *Map {

	return that
}

//增加接口
func (that Map) Put(key string, value interface{}) {
	//if that==nil{
	//	that=Map{}
	//}
	that[key] = value
}

//删除接口
func (that Map) Delete(key string) {
	delete(that, key)

}

//获取Int
func (that Map) GetInt(key string, err ...*Error) int {
	v := ObjToInt((that)[key], err...)

	return v

}

//获取Int
func (that Map) GetInt64(key string, err ...*Error) int64 {
	v := ObjToInt64((that)[key], err...)
	return v

}

//获取向上取整Int64
func (that Map) GetCeilInt64(key string, err ...*Error) int64 {
	v := ObjToCeilInt64((that)[key], err...)
	return v

}

//获取向上取整Int
func (that Map) GetCeilInt(key string, err ...*Error) int {
	v := ObjToCeilInt((that)[key], err...)
	return v

}

//获取向上取整float64
func (that Map) GetCeilFloat64(key string, err ...*Error) float64 {
	v := ObjToCeilFloat64((that)[key], err...)
	return v

}

//获取Float64
func (that Map) GetFloat64(key string, err ...*Error) float64 {

	v := ObjToFloat64((that)[key], err...)

	return v

}

func (that Map) GetSlice(key string, err ...*Error) Slice {

	//var v Slice
	v := ObjToSlice((that)[key], err...)

	return v

}
func (that Map) GetBool(key string, err ...*Error) bool {

	//var v Slice
	v := ObjToBool((that)[key], err...)

	return v

}
func (that Map) RangeSort(callback func(k string, v interface{}) (isEnd bool)) {
	testQu := []string{}
	//testQuData:= qu[0].(Map)
	for key, _ := range that {
		//fmt.Println(key, ":", value)
		testQu = append(testQu, key)
	}
	sort.Strings(testQu)
	for _, k := range testQu {
		re := callback(k, that[k])
		if re {
			return
		}
	}

}

func (that Map) GetMap(key string, err ...*Error) Map {
	//var data Slice

	v := ObjToMap((that)[key], err...)

	return v

}

func (that Map) Get(key string, err ...*Error) interface{} {

	if v, ok := (that)[key]; ok {
		return v
	}
	e := errors.New("没有存储key及对应的数据")

	if len(err) != 0 {
		err[0].SetError(e)

	}
	return nil
}

//请传递指针过来
func (that Map) ToStruct(stct interface{}) {

	data := reflect.ValueOf(stct).Elem()
	for k, v := range that {
		ks := StrFirstToUpper(k)
		dkey := data.FieldByName(ks)
		if !dkey.IsValid() {
			continue
		}
		switch dkey.Type().String() {
		case "int":
			dkey.SetInt(that.GetInt64(k))
		case "int64":
			dkey.Set(reflect.ValueOf(that.GetInt64(k)))
		case "float64":
			dkey.Set(reflect.ValueOf(that.GetFloat64(k)))
		case "string":
			dkey.Set(reflect.ValueOf(that.GetString(k)))
		case "interface{}":
			dkey.Set(reflect.ValueOf(v))
		}
	}

}

func (that Map) ToJsonString() string {
	return ObjToStr(that)

}

func (that Map) JsonToMap(jsonStr string, err ...*Error) {
	e := json.Unmarshal([]byte(jsonStr), &that)
	if e != nil && len(err) != 0 {
		err[0].SetError(e)
	}

}