package database

import (
	"context"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"

	"github.com/grafana/grafana/pkg/components/satokengen"
	"github.com/grafana/grafana/pkg/services/org"
	"github.com/grafana/grafana/pkg/services/serviceaccounts"
	"github.com/grafana/grafana/pkg/services/serviceaccounts/tests"
)

func TestIntegrationStore_UsageStats(t *testing.T) {
	if testing.Short() {
		t.Skip("skipping test in short mode")
	}

	saToCreate := tests.TestUser{Login: "servicetestwithTeam@admin", IsServiceAccount: true}
	db, store := setupTestDatabase(t)
	sa := tests.SetupUserServiceAccount(t, db, store.cfg, saToCreate)

	store.cfg.SATokenExpirationDayLimit = 4

	keyName := t.Name()
	key, err := satokengen.New(keyName)
	require.NoError(t, err)

	cmd := serviceaccounts.AddServiceAccountTokenCommand{
		Name:          keyName,
		OrgId:         sa.OrgID,
		Key:           key.HashedKey,
		SecondsToLive: 0,
	}

	_, err = store.AddServiceAccountToken(context.Background(), sa.ID, &cmd)
	require.NoError(t, err)

	role := org.RoleNone
	form := serviceaccounts.UpdateServiceAccountForm{
		Role: &role,
	}
	_, err = store.UpdateServiceAccount(context.Background(), sa.OrgID, sa.ID, &form)
	require.NoError(t, err)

	stats, err := store.GetUsageMetrics(context.Background())
	require.NoError(t, err)

	assert.Equal(t, int64(1), stats.ServiceAccounts)
	assert.Equal(t, int64(1), stats.ServiceAccountsWithNoRole)
	assert.Equal(t, int64(1), stats.Tokens)
	assert.Equal(t, true, stats.ForcedExpiryEnabled)
}
