package common

import (
	"errors"
	"go-admin/pkg/cryptohelper/jwthelper"
	"net"
	"strconv"

	"github.com/gin-gonic/gin"
)

// 通过原生 token 获取登录用户 ID，判断是否登录。
// 注：该方法未经过登录中间件，从原始 token 中解析出登录信息，而非从已解析的 token 串中获取登录信息。
func GetUserIdByToken(ctx *gin.Context) int {
	token := ctx.GetHeader("token")
	if len(token) == 0 {
		return 0
	}
	// 解析token
	flag, rew := jwthelper.MidValidToken(token, 3)
	if flag < 0 || len(rew) == 0 {
		return 0
	}

	loginUser := jwthelper.GetLoginUserJwt(rew)

	return loginUser.UserID
}

// 获取操作系统：1-Android，2-IOS，3-PC
func GetOS(ctx *gin.Context) int {
	osStr := ctx.GetHeader("os")      // 获取请求头中的"os"字段
	osInt, err := strconv.Atoi(osStr) // 转换为整数
	if err != nil {
		return 0 // 如果转换失败，返回0
	}
	return osInt
}

// 获取 设备ID
func GetDeviceID(ctx *gin.Context) string {
	device := ctx.GetHeader("device_id") // 获取请求头中的"os"字段

	return device
}

// 获取 language，默认语言：zh_CN
// 英语 en
// 日本语 jp
// 韩语 kr
// 马来西亚语 my
// 泰国语 th
// 越南语 vn
// 简体中文 zh_CN
// 繁体中文 zh_HK
func GetLanguage(ctx *gin.Context) string {
	lang := ""

	language := ctx.GetHeader("Accept-Language")
	if language == "" {

		val, exits := ctx.Get("language")

		if !exits {
			lang = "zh_CN"
		} else {
			lang = val.(string)
		}

	} else {
		lang = language
	}
	return lang
}

// 根据token获取当前userid
func GetUserId(ctx *gin.Context) int {
	token := ctx.GetHeader("ParseToken") // .Request.Header.Peek("token")
	// loghelper.Debug("token:  " + token)
	if len(token) == 0 {
		return 0
	}
	tokenItem := jwthelper.GetLoginUserJwt(token)
	return tokenItem.UserID
}

// GetClientIp 获取本机ip
func GetClientIp() (string, error) {
	adders, err := net.InterfaceAddrs()
	if err != nil {
		return "", err
	}
	for _, address := range adders {
		// 检查ip地址判断是否回环地址
		if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
			if ipnet.IP.To4() != nil {
				return ipnet.IP.String(), nil
			}

		}
	}
	return "", errors.New("Can not find the client ip address!")
}
