package utils

import (
	"fmt"
	"reflect"
	"sort"
	"strings"
)

type KeyValue struct {
	Key   string
	Value string
}

func LowercaseFirstLetter(s string) string {
	if len(s) == 0 {
		return s
	}
	firstLetter := strings.ToLower(s[:1])
	return firstLetter + s[1:]
}

func SortStruct(data any) []KeyValue {
	v := reflect.ValueOf(data).Elem()
	t := v.Type()
	var kv []KeyValue
	for i := 0; i < v.NumField(); i++ {
		field := v.Field(i)
		key := LowercaseFirstLetter(t.Field(i).Name)
		value := fmt.Sprintf("%v", field.Interface())
		kv = append(kv, KeyValue{Key: key, Value: value})
	}
	sort.SliceStable(kv, func(i, j int) bool {
		return kv[i].Key < kv[j].Key
	})
	return kv
}

func SortStructJsonTag(data any) []KeyValue {
	// 获取 data 结构体的类型和值
	dataType := reflect.TypeOf(data).Elem()
	dataValue := reflect.ValueOf(data).Elem()

	var kv []KeyValue
	for i := 0; i < dataType.NumField(); i++ {
		field := dataType.Field(i)
		// 获取字段的值
		fieldValue := dataValue.FieldByName(field.Name).Interface()
		// 获取 JSON 字段名
		jsonTagName := field.Tag.Get("json")
		if jsonTagName != "" {
			kv = append(kv, KeyValue{Key: jsonTagName, Value: fmt.Sprintf("%v", fieldValue)})
		}
	}

	// 排序
	sort.SliceStable(kv, func(i, j int) bool {
		return kv[i].Key < kv[j].Key
	})

	return kv
}