package helper

import (
	"fmt"
	"strings"
)

func ArrDeduplication[T int | int32 | uint32 | uint64 | int64 | int8 | string](arr []T) []T {
	seen := map[T]bool{}
	var result []T
	for _, num := range arr {
		if !seen[num] {
			seen[num] = true
			result = append(result, num)
		}
	}
	return result
}

// BuildStr 函数用于将 uid 和 arr 中的元素拼接成一个字符串
func BuildStr[T int | int32 | uint32 | uint64 | int64 | int8 | string](uid string, arr []T) string {
	// 创建一个 strings.Builder 实例，用于高效地构建字符串
	var sb strings.Builder

	// 写入初始的 uid
	sb.WriteString(uid)

	// 遍历 arr 切片中的每个元素
	for i, id := range arr {
		// 如果不是第一个元素，先写入下划线分隔符
		if i > 0 {
			sb.WriteByte('_')
		} else if sb.Len() > 0 {
			// 如果 uid 不为空且是第一个元素，也写入下划线分隔符
			sb.WriteByte('_')
		}
		// 根据元素的类型进行不同的处理
		switch v := any(id).(type) {
		case string:
			// 如果是字符串类型，直接写入
			sb.WriteString(v)
		default:
			// 对于其他类型，使用 fmt.Sprint 转换为字符串后写入
			sb.WriteString(fmt.Sprint(v))
		}
	}

	// 将 strings.Builder 中的内容转换为字符串并返回
	return sb.String()
}
