package tokens

import (
	"crypto/hmac"
	"crypto/sha256"
	"encoding/base64"
	"fmt"
	"strings"
	"time"

	"github.com/sirupsen/logrus"
)

// NewToken generates a token for accessing a specific method of the API
func NewToken(userID string, key string, method string, action string, timestamp time.Time) string {
	fmtTime := timestamp.Format("20060102T150405Z")
	logrus.Debugf("Built timestamp: %s", fmtTime)

	message := strings.Join([]string{method, action, fmtTime}, "")
	logrus.Debugf("Built message: %s", message)

	signatureHmac := hmac.New(sha256.New, []byte(key))

	signatureHmac.Write([]byte(message))

	signature := base64.StdEncoding.EncodeToString([]byte(signatureHmac.Sum(nil)))
	logrus.Debugf("Built signature: %s", signature)

	userIDAndSignature := fmt.Sprintf("%s:%s", userID, signature)

	token := base64.StdEncoding.EncodeToString([]byte(userIDAndSignature))
	logrus.Debugf("Built token: %s", token)

	return token
}
