package helper

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

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

// FieldKeyValue 定义一个结构体用于存储字段名和对应的值
type FieldKeyValue struct {
	Key   string
	Value interface{}
}

// SortStructFieldsByKey 按照键名对结构体导出字段进行字典序排序，并返回键值对切片
func SortStructFieldsByKey(s interface{}) []FieldKeyValue {
	// 获取结构体的反射值
	value := reflect.ValueOf(s)
	// 如果传入的是指针，获取指针指向的值
	if value.Kind() == reflect.Ptr {
		value = value.Elem()
	}
	// 检查是否为结构体
	if value.Kind() != reflect.Struct {
		return nil
	}
	// 获取结构体的类型
	typ := value.Type()
	// 存储字段名和对应的值
	fieldKVs := make([]FieldKeyValue, 0, typ.NumField())
	// 遍历结构体的所有字段
	for i := 0; i < typ.NumField(); i++ {
		field := typ.Field(i)
		// 只处理导出的字段（PkgPath 为空表示导出字段）
		if field.PkgPath == "" {
			// 获取字段名
			fieldName := field.Name
			// 获取字段的值
			fieldValue := value.Field(i).Interface()
			// 将字段名和对应的值存储到切片中
			fieldKVs = append(fieldKVs, FieldKeyValue{
				Key:   LowercaseFirstLetter(fieldName),
				Value: fieldValue,
			})
		}
	}
	// 对键值对切片按照键名进行字典序排序
	sort.Slice(fieldKVs, func(i, j int) bool {
		return fieldKVs[i].Key < fieldKVs[j].Key
	})
	return fieldKVs
}
