package auth

import (
	"testing"
	"time"

	"secondbit.org/uuid"
)

var tokenStores = []TokenStore{NewMemstore()}

func TestTokenStoreSuccess(t *testing.T) {
	token := Token{
		AccessToken:  "access",
		RefreshToken: "refresh",
		Created:      time.Now(),
		ExpiresIn:    3600,
		TokenType:    "bearer",
		Scope:        "scope",
		ProfileID:    uuid.NewID(),
	}
	for pos, store := range tokenStores {
		err := store.SaveToken(token)
		if err != nil {
			t.Errorf("Error saving token in TokenStore #%d: %s", pos, err)
		}
		retrievedAccess, err := store.GetToken(token.AccessToken, false)
		if err != nil {
			t.Errorf("Error retrieving token in TokenStore #%d: %s", pos, err)
		}
		t.Log(retrievedAccess)
		// TODO: compare retrievedAccess to token
		retrievedRefresh, err := store.GetToken(token.RefreshToken, true)
		if err != nil {
			t.Errorf("Error retrieving refresh token in TokenStore #%d: %s", pos, err)
		}
		t.Log(retrievedRefresh)
		// TODO: compare retrievedRefresh to token
		retrievedProfile, err := store.GetTokensByProfileID(token.ProfileID, 25, 0)
		if err != nil {
			t.Errorf("Error retrieving token by profile in TokenStore #%d: %s", pos, err)
		}
		if len(retrievedProfile) != 1 {
			t.Errorf("Expected 1 token retrieved by profile ID from TokenStore #%d, got %+v", pos, retrievedProfile)
		}
		// TODO: compare retrievedProfile to token
		err = store.RemoveToken(token.AccessToken)
		if err != nil {
			t.Errorf("Error removing token in TokenStore #%d: %s", pos, err)
		}
		_, err = store.GetToken(token.AccessToken, false)
		if err != ErrTokenNotFound {
			t.Errorf("Expected ErrTokenNotFound from TokenStore #%d, got %s", pos, err)
		}
		_, err = store.GetToken(token.RefreshToken, true)
		if err != ErrTokenNotFound {
			t.Errorf("Expected ErrTokenNotFound from TokenStore #%d, got %s", pos, err)
		}
		retrievedProfile, err = store.GetTokensByProfileID(token.ProfileID, 25, 0)
		if err != nil {
			t.Errorf("Error retrieving token by profile in TokenStore #%d: %s", pos, err)
		}
		if len(retrievedProfile) != 0 {
			t.Errorf("Expected list of 0 tokens from TokenStore #%d, got %+v", pos, retrievedProfile)
		}
	}
}
