package strutil

import (
	"strconv"
	sliceutil "tinyrdm/backend/utils/slice"
)

// EncodeRedisKey encode the redis key to integer array
// if key contains binary which could not display on ui, convert the key to char array
func EncodeRedisKey(key string) any {
	if ContainsBinary(key) {
		b := []byte(key)
		arr := make([]int, len(b))
		for i, bb := range b {
			arr[i] = int(bb)
		}
		return arr
	}
	return key
}

// DecodeRedisKey decode redis key to readable string
func DecodeRedisKey(key any) string {
	switch key.(type) {
	case string:
		return key.(string)

	case []any:
		arr := key.([]any)
		bytes := sliceutil.Map(arr, func(i int) byte {
			if c, ok := AnyToInt(arr[i]); ok {
				return byte(c)
			}
			return '0'
		})
		return string(bytes)

	case []int:
		arr := key.([]int)
		b := make([]byte, len(arr))
		for i, bb := range arr {
			b[i] = byte(bb)
		}
		return string(b)
	}
	return ""
}

// AnyToInt convert any value to int
func AnyToInt(val any) (int, bool) {
	switch val.(type) {
	case string:
		num, err := strconv.Atoi(val.(string))
		if err != nil {
			return 0, false
		}
		return num, true
	case float64:
		return int(val.(float64)), true
	case float32:
		return int(val.(float32)), true
	case int64:
		return int(val.(int64)), true
	case int32:
		return int(val.(int32)), true
	case int:
		return val.(int), true
	case bool:
		if val.(bool) {
			return 1, true
		} else {
			return 0, true
		}
	}
	return 0, false
}