package stringUtil

import (
	"regexp"
	"runtime"
	"sort"
	"strconv"
	"strings"
	"unicode"
)

// 检查一个字符串是否是空字符串
// content:上下文字符串
// 返回值：
// bool:true：空字符串 false：非空字符串
func IsEmpty(content string) bool {
	if len(content) <= 0 {
		return true
	}

	return strings.IndexFunc(content, func(item rune) bool {
		return unicode.IsSpace(item) == false
	}) < 0
}

// 截取字符串
// start：开始位置
// length：截取长度
// 返回值：
// 截取后的字符串
func Substring(str string, start, length int) string {
	// 先将字符串转化为[]rune格式（由于rune是字符串的基本单位）
	runeString := []rune(str)
	runeLength := len(runeString)
	end := 0

	// 计算起始位置
	if start > runeLength {
		start = runeLength
	}

	// 计算终止位置
	end = start + length
	if end > runeLength {
		end = runeLength
	}

	if start > end {
		start, end = end, start
	}

	return string(runeString[start:end])
}

// 根据不同平台获取换行符
// 返回值：
// 换行符
func GetNewLineString() string {
	switch os := runtime.GOOS; os {
	case "windows":
		return "\r\n"
	default:
		return "\n"
	}
}

// 检查是否存在特殊符号
// 1. emoji字符
// 2. ascii控制字符
// 3. \ " '
// val:待检查的字符串
// 返回值:
// bool:true:有特殊字符 false:无特殊字符
func IfHaveSpecialChar(val string) bool {
	if len(val) <= 0 {
		return false
	}

	// 表情符号过滤
	// Wide UCS-4 build
	emojiReg, _ := regexp.Compile("[^\U00000000-\U0000FFFF]+")
	if emojiReg.Match([]byte(val)) {
		return true
	}

	// 排除控制字符和特殊字符
	for _, charItem := range val {
		// 排除控制字符
		if (charItem > 0 && charItem < 0x20) || charItem == 0x7F {
			return true
		}

		// 排除部分特殊字符：  \ " '
		switch charItem {
		case '\\':
			fallthrough
		case '"':
			fallthrough
		case '\'':
			return true
		}
	}

	return false
}

// 判断string数组是否内容唯一
func IsDistinct_string(list []string) (result bool) {
	if len(list) == 0 || len(list) == 1 {
		result = true
		return
	}

	sort.Strings(list)

	for i := 0; i < len(list)-1; i++ {
		if list[i] == list[i+1] {
			result = false
			return
		}
	}

	result = true
	return
}

// 验证是否是电话号码
func VerifyPhone(phone string) bool {
	regular := "^1[3-9]\\d{9}$"

	reg := regexp.MustCompile(regular)
	return reg.MatchString(phone)
}

// 转型成int64
func StringToInt64(str string) int64 {
	num, err := strconv.ParseInt(str, 10, 64)
	if err != nil {
		return 0
	}
	return num
}
