package sessiontest

import (
	"math/rand"

	"github.com/google/uuid"
	"github.com/nspcc-dev/neofs-api-go/pkg/owner"
	"github.com/nspcc-dev/neofs-api-go/pkg/session"
	crypto "github.com/nspcc-dev/neofs-crypto"
	"github.com/nspcc-dev/neofs-crypto/test"
)

// Generate returns random session.Token.
//
// Resulting token is unsigned.
func Generate() *session.Token {
	tok := session.NewToken()

	uid, err := uuid.New().MarshalBinary()
	if err != nil {
		panic(err)
	}

	w := new(owner.NEO3Wallet)
	rand.Read(w.Bytes())

	ownerID := owner.NewID()
	ownerID.SetNeo3Wallet(w)

	keyBin := crypto.MarshalPublicKey(&test.DecodeKey(0).PublicKey)

	tok.SetID(uid)
	tok.SetOwnerID(ownerID)
	tok.SetSessionKey(keyBin)
	tok.SetExp(11)
	tok.SetNbf(22)
	tok.SetIat(33)

	return tok
}

// GenerateSigned returns signed random session.Token.
//
// Panics if token could not be signed (actually unexpected).
func GenerateSigned() *session.Token {
	tok := Generate()

	err := tok.Sign(test.DecodeKey(0))
	if err != nil {
		panic(err)
	}

	return tok
}