package auth

import (
	"context"

	"github.com/nspcc-dev/neofs-api-go/service"
	"github.com/pkg/errors"
)

type contextKey string

const bearerTokenContextKey contextKey = "bearer-token"

// GetBearerToken returns a bearer token embedded into a context or error, if any.
func GetBearerToken(ctx context.Context) (*service.BearerTokenMsg, error) {
	bt := ctx.Value(bearerTokenContextKey)
	if bt == nil {
		return nil, errors.New("got nil bearer token")
	}
	v, ok := bt.(*service.BearerTokenMsg)
	if !ok {
		return nil, errors.Errorf("extracted unexpected type other than bearer token's: %T", v)
	}
	return v, nil
}

// SetBearerToken return a context with embedded bearer token.
func SetBearerToken(ctx context.Context, bearerToken *service.BearerTokenMsg) context.Context {
	return context.WithValue(ctx, bearerTokenContextKey, bearerToken)
}