package utils

import (
	"encoding/base64"
	"math/rand"
	"net/http"
	"os"
	"path/filepath"
	"runtime"
	"strconv"
	"strings"
	"time"
)

// 客户端类型
const (
	ClientAdmin  = "client-admin"
	ClientWechat = "client-wechat"
	ClientMini   = "client-mini"
)

// 一些 UA 列表
const (
	UAWechat      = "micromessenger"
	UAMiniProgram = "miniprogram"
)

// GetClientType 获取客户端类型
// 默认返回是 管理端
func GetClientType(r *http.Request) string {
	ua := strings.ToLower(r.Header.Get("User-Agent"))

	if strings.Index(ua, UAWechat) > -1 {
		// if strings.Index(ua, UAMiniProgram) > -1 {
		// 	return ClientMini
		// }

		return ClientWechat
	}

	return ClientAdmin
}

// StrSliceIndexOf slice indexof
func StrSliceIndexOf(s []string, t string) int64 {
	if s == nil || len(s) == 0 {
		return -1
	}

	for k, v := range s {
		if v == t {
			return int64(k)
		}
	}

	return -1
}

// GUIID2IntString guid 转 int 字符串
func GUIID2IntString(id string) []string {
	if id == "" {
		return nil
	}

	res := make([]string, 0)
	for _, part := range strings.Split(id, "-") {
		sum := 0
		for _, r := range []rune(part) {
			sum += int(r)
		}

		res = append(res, strconv.Itoa(sum))
	}

	return res
}

// EncodeBase64TrimTail base64 加密, 去除末尾 =
func EncodeBase64TrimTail(src string) string {
	if src == "" {
		return ""
	}

	enStr := base64.StdEncoding.EncodeToString([]byte(src))

	return strings.TrimRight(enStr, "=")
}

// DecodeBase64NoTail base64解密, 位数不够的, 自动补全
func DecodeBase64NoTail(src string) string {
	if src == "" {
		return ""
	}

	pd := 4 - len(src)%4
	if pd > 0 && pd != 4 {
		src += strings.Repeat("=", pd)
	}

	res, err := base64.StdEncoding.DecodeString(src)
	if err != nil {
		LogError("解密 Base64 字串失败: " + err.Error())
		return ""
	}

	return string(res)
}

// GetPageNaviLimit 获取 mysql limit 限定
func GetPageNaviLimit(params ...int) []int {
	page := 1
	pagesize := 10

	if params != nil {
		pl := len(params)

		if pl > 0 {
			page = params[0]
			if page < 1 {
				page = 1
			}
		}

		if pl > 1 {
			pagesize = params[1]
		}
	}

	return []int{
		pagesize,
		(page - 1) * pagesize,
	}
}

// GenerateQRCode 生成二维码数字
func GenerateQRCode() string {
	var temp1 int = rand.Intn(9)*87 + 11
	var temp2 int = rand.Intn(9)*89 + 13
	nano := time.Now().UnixNano()
	var nanostr string = strconv.FormatInt(nano, 10)
	var temp3 string = nanostr[11:]
	var temp4 string = "6"
	var temp5 int = rand.Intn(9)*7 + 17
	var code string = "66" + strconv.Itoa(temp1) + temp4 + strconv.Itoa(temp2) + temp3 + strconv.Itoa(temp5)
	return code
}

// GetFiveSeconds 获取 5 秒钟的时间
func GetFiveSeconds(t time.Time) string {
	str := t.Format("20060102150405")
	strLen := len(str)

	lastNum, _ := strconv.Atoi(str[strLen-1:])
	if lastNum < 5 {
		lastNum = 0
	} else {
		lastNum = 5
	}

	return str[:strLen-1] + strconv.Itoa(lastNum)
}

// 当前运行环境
var processEnv string
var appRoot string

// GetAppRoot 获取系统根目录
func GetAppRoot() string {
	if appRoot != "" {
		return appRoot
	}

	if processEnv == "" {
		for _, arg := range os.Args {
			if strings.Index(arg, "-test.run") > -1 {
				processEnv = "test"
				break
			}
		}

		if processEnv == "" {
			processEnv = "production"
		}
	}

	if processEnv == "test" {
		_, file, _, _ := runtime.Caller(1)
		appRoot, _ = filepath.Abs(filepath.Dir(filepath.Join(file, ".."+string(filepath.Separator))))
	} else {
		appRoot, _ = filepath.Abs(filepath.Dir(os.Args[0]))
	}

	return appRoot
}