package common

import (
	"encoding/base64"
	"strings"

	"github.com/labstack/gommon/random"
	"github.com/minio/sha256-simd"

	serror "github.com/pingcap/test-infra/services/tcms/service/common/errors"
)

const (
	TOKEN_PREFIX         = "tcmsp_"
	TOKEN_SIZE           = 20
	MAX_USER_TOKEN_COUNT = 10
)

func GenerateToken() (token, hashedToken string) {
	token = random.String(TOKEN_SIZE)
	hashedToken = HashToken(token)
	return
}

func HashToken(t string) string {
	b := sha256.Sum256([]byte(t))
	return base64.StdEncoding.EncodeToString(b[:])
}

// TrimAndHashToken returns error if the token format is invalid.
func TrimAndHashToken(t string) (string, error) {
	origLen := len(t)
	t = strings.TrimPrefix(t, TOKEN_PREFIX)
	trimedLen := len(t)
	if origLen == trimedLen || trimedLen != TOKEN_SIZE {
		return "", serror.ErrInvalidToken
	}

	return HashToken(t), nil
}
