// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
// Licensed under the GNU Affero General Public License (AGPL).
// See License.AGPL.txt in the project root for license information.

package auth

import (
	"context"
	"errors"
)

type contextKey int

const (
	authContextKey contextKey = iota
)

type TokenType int

const (
	AccessTokenType TokenType = iota
	CookieTokenType
)

type Token struct {
	Type  TokenType
	Value string
}

func NewAccessToken(token string) Token {
	return Token{
		Type:  AccessTokenType,
		Value: token,
	}
}

func NewCookieToken(cookie string) Token {
	return Token{
		Type:  CookieTokenType,
		Value: cookie,
	}
}

func TokenToContext(ctx context.Context, token Token) context.Context {
	return context.WithValue(ctx, authContextKey, token)
}

func TokenFromContext(ctx context.Context) (Token, error) {
	if val, ok := ctx.Value(authContextKey).(Token); ok {
		return val, nil
	}

	return Token{}, errors.New("no token present on context")
}
