package utils

import (
	"crypto/md5"
	"fmt"
	"strconv"
)

const charset = "A0a12B3b4CDc56Ede7FGf8Hg9IhJKiLjkMNlmOPnQRopqrSstTuvUVwxWXyYzZ"

func generateCharset(url, hexMd5 string, len, sectionNum int, cb func(url, keyword string) bool) string {
	for i := 0; i < sectionNum; i++ {
		sectionHex := hexMd5[i*8 : 8+i*8]
		bits, _ := strconv.ParseUint(sectionHex, 16, 32)
		bits = bits & 0x3FFFFFFF
		keyword := ""
		for j := 0; j < len; j++ {
			idx := bits & 0x3D
			keyword = keyword + string(charset[idx])
			bits = bits >> 5
		}
		if cb(url, keyword) {
			return keyword
		}
	}
	return ""
}

// 起初生成6位的短码,当四组6位短码都重复时,再生成8位的短码,因此总共会有8个短码供你选择。

func GenerateShortUrl(url string, cb func(url, keyword string) bool) string {
	if url == "" || cb == nil {
		return ""
	}
	hexMd5 := fmt.Sprintf("%x", md5.Sum([]byte(url)))
	sections := len(hexMd5) / 8

	keyword := generateCharset(url, hexMd5, 6, sections, cb)
	if keyword == "" {
		return generateCharset(url, hexMd5, 8, sections, cb)
	}
	return keyword
}