package json

import (
	"encoding/json"
	"reflect"
	"strconv"
	"strings"
)

// JSON对象接口 支持按属性路径访问属性
type JSONObject struct {
	m map[string]interface{}
}

func (j *JSONObject) UnmarshalJSON(data []byte) error {
	err := json.Unmarshal(data, &j.m)
	if err != nil {

		return err
	}
	return nil
}
func (j *JSONObject) getBySlice(path []string) interface{} {
	if len(j.m) == 1 {
		data, ok := j.m["data"]
		if ok && reflect.TypeOf(data).Kind() == reflect.Slice {
			index, _ := strconv.Atoi(path[0])
			v := data.([]interface{})[index]
			if len(path) == 1 {
				return v
			}
			if reflect.ValueOf(v).Kind() == reflect.Map {
				t := JSONObject{m: v.(map[string]interface{})}
				return t.getBySlice(path[1:])
			}
			return nil
		}
	}
	v, ok := j.m[path[0]]
	if !ok {
		return nil
	}

	if len(path) == 1 {
		return v
	}
	if reflect.ValueOf(v).Kind() == reflect.Map {
		t := JSONObject{m: v.(map[string]interface{})}
		return t.getBySlice(path[1:])
	}
	return nil
}

// @title 获取属性
// @param path 属性路径，以'.'分割
func (j *JSONObject) Get(path string) interface{} {
	paths := strings.Split(path, ".")
	return j.getBySlice(paths)
}
