package rand

import (
	"crypto/rand"
	"encoding/base64"

	"github.com/influxdata/platform"
)

// TODO: rename to token.go

// TokenGenerator implements platform.TokenGenerator.
type TokenGenerator struct {
	size int
}

// NewTokenGenerator creates an instance of an platform.TokenGenerator.
func NewTokenGenerator(n int) platform.TokenGenerator {
	return &TokenGenerator{
		size: n,
	}
}

// Token returns a new string token of size t.size.
func (t *TokenGenerator) Token() (string, error) {
	return generateRandomString(t.size)
}

func generateRandomString(s int) (string, error) {
	b, err := generateRandomBytes(s)
	return base64.URLEncoding.EncodeToString(b), err
}

func generateRandomBytes(n int) ([]byte, error) {
	b := make([]byte, n)
	if _, err := rand.Read(b); err != nil {
		return nil, err
	}

	return b, nil
}