// Package codes 常量的基类
package codes

// MapCodesDefaultValue 默认值
const MapCodesDefaultValue = "-"

// KType key的类型
type KType interface{}

// VType value的类型
type VType interface {
	GetName() KType
	GetValue() KType
}

// CVType key-value
type CVType[K KType, V KType] struct {
	Name  K
	Value V
}

// GetName 获取某个key对应的key
func (vt CVType[K, V]) GetName() KType {
	return vt.Name
}

// GetValue 获取某个key对应的value
func (vt CVType[K, V]) GetValue() KType {
	return vt.Value
}

// CMap map
type CMap[V VType] []V

// Get 获取某个key对应的value
func (c CMap[V]) Get(key KType) string {
	for _, v := range c {
		if v.GetName() == key {
			return v.GetValue().(string)
		}
	}
	return MapCodesDefaultValue
}

// GetList 获取全部
func (c CMap[V]) GetList() CMap[V] {
	return c
}

// GetWithoutList 去掉某些不需要的key
func (c CMap[V]) GetWithoutList(keys ...KType) CMap[V] {
	tCMap := c.GetList()
	// 创建一个映射表，用于快速判断是否需要去除指定的 key
	removeMap := make(map[KType]bool)
	for _, key := range keys {
		removeMap[key] = true
	}
	// 倒序遍历切片并移除需要去除的元素
	for i := len(tCMap) - 1; i >= 0; i-- {
		if removeMap[tCMap[i].GetName()] {
			tCMap = append(tCMap[:i], tCMap[i+1:]...)
		}
	}
	return tCMap
}

// GetOnlyList 只需要某些Key
func (c CMap[V]) GetOnlyList(keys ...KType) CMap[V] {
	tCMap := make(CMap[V], 0)
	// 创建一个映射表，用于快速判断是否需要保留指定的 key
	keepMap := make(map[KType]bool)
	for _, key := range keys {
		keepMap[key] = true
	}
	// 遍历切片并保留指定的元素
	for _, item := range c {
		if keepMap[item.GetName()] {
			tCMap = append(tCMap, item)
		}
	}
	return tCMap.GetList()
}
