package utils

import "strconv"

func BeUniqueSlice_string(src, dest []string) (add []string, del []string, same []string) {
	srcMap := make(map[string]byte) //按源数组建索引
	allMap := make(map[string]byte) //所有元素建索引

	//1.建立map
	for _, v := range src {
		srcMap[v] = 0
		allMap[v] = 0
	}

	//2.将 dest 元素添加到 mall(msrc) 中,长度发生变化,即元素添加成功, 记录添加不成功的元素,便是重复元素
	for _, v := range dest {
		l := len(allMap)
		allMap[v] = 0
		if l != len(allMap) {
			l = len(allMap)
		} else {
			same = append(same, v)
		}
	}

	//3.找相同
	for _, v := range same {
		delete(allMap, v)
	}

	//4.找不同
	for v, _ := range allMap {
		_, exist := srcMap[v]
		if exist {
			del = append(del, v)
		} else {
			add = append(add, v)
		}
	}

	return
}

func BeUniqueSlice_uint(src, dest []uint) (add []uint, del []uint, same []uint) {
	srcMap := make(map[uint]byte) //按源数组建索引
	allMap := make(map[uint]byte) //所有元素建索引

	//1.建立map
	for _, v := range src {
		srcMap[v] = 0
		allMap[v] = 0
	}

	//2.将 dest 元素添加到 mall(srcMap) 中,长度发生变化,即元素添加成功, 记录添加不成功的元素,便是重复元素
	for _, v := range dest {
		l := len(allMap)
		allMap[v] = 0
		if l != len(allMap) {
			l = len(allMap)
		} else {
			same = append(same, v)
		}
	}

	//3.找相同
	for _, v := range same {
		delete(allMap, v)
	}

	//4.找不同
	for v, _ := range allMap {
		_, exist := srcMap[v]
		if exist {
			del = append(del, v)
		} else {
			add = append(add, v)
		}
	}

	return
}

func ConvertString2Uint(src []string) (dest []uint) {
	for i := 0; i < len(src); i++ {
		x, _ := strconv.ParseUint(src[i], 10, 64)
		dest = append(dest, uint(x))
	}
	return
}

func ConvertUint2String(src []uint) (dest []string) {
	for i := 0; i < len(src); i++ {
		x := strconv.FormatUint(uint64(src[i]), 10)
		dest = append(dest, x)
	}
	return
}