package ds_ignorestore

import (
	"context"
	"testing"
	"time"

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

	"go.skia.org/infra/go/ds"
	ds_testutil "go.skia.org/infra/go/ds/testutil"
	"go.skia.org/infra/go/sktest"
	"go.skia.org/infra/go/testutils/unittest"
	"go.skia.org/infra/golden/go/ignore"
)

func TestDatastoreIgnoreStore(t *testing.T) {
	unittest.LargeTest(t)

	// Run against the locally running emulator.
	cleanup := ds_testutil.InitDatastore(t, ds.IGNORE_RULE, ds.HELPER_RECENT_KEYS)
	defer cleanup()

	store, err := New(ds.DS)
	require.NoError(t, err)
	ignoreStoreAll(t, store)
}

func ignoreStoreAll(t sktest.TestingT, store ignore.Store) {
	// Add a few instances.
	r1 := ignore.NewRule("jon@example.com", time.Now().Add(time.Hour), "config=gpu", "reason")
	r2 := ignore.NewRule("jim@example.com", time.Now().Add(time.Minute*10), "config=8888", "No good reason.")
	r3 := ignore.NewRule("jon@example.com", time.Now().Add(time.Minute*50), "extra=123&extra=abc", "Ignore multiple.")
	r4 := ignore.NewRule("jon@example.com", time.Now().Add(time.Minute*100), "extra=123&extra=abc&config=8888", "Ignore multiple.")
	require.NoError(t, store.Create(context.Background(), r1))
	require.NoError(t, store.Create(context.Background(), r2))
	require.NoError(t, store.Create(context.Background(), r3))
	require.NoError(t, store.Create(context.Background(), r4))

	allRules, err := store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 4, len(allRules))

	r1, r2, r3, r4 = allRules[0], allRules[1], allRules[2], allRules[3]
	assert.NotZero(t, r1.ID)
	assert.NotZero(t, r2.ID)
	assert.NotZero(t, r3.ID)
	assert.NotZero(t, r4.ID)

	// Remove the third and fourth rule
	delCount, err := store.Delete(context.Background(), r3.ID)
	require.NoError(t, err)
	require.Equal(t, 1, delCount)
	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 3, len(allRules))

	delCount, err = store.Delete(context.Background(), r4.ID)
	require.NoError(t, err)
	require.Equal(t, 1, delCount)
	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 2, len(allRules))

	for _, oneRule := range allRules {
		require.True(t, (oneRule.ID == r1.ID) || (oneRule.ID == r2.ID))
	}

	delCount, err = store.Delete(context.Background(), r1.ID)
	require.NoError(t, err)
	require.Equal(t, 1, delCount)
	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 1, len(allRules))
	require.Equal(t, r2.ID, allRules[0].ID)

	// Update a rule.
	updatedRule := allRules[0]
	updatedRule.Note = "an updated rule"
	err = store.Update(context.Background(), updatedRule)
	require.NoError(t, err, "Update should succeed.")
	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 1, len(allRules))
	require.Equal(t, r2.ID, allRules[0].ID)
	require.Equal(t, "an updated rule", allRules[0].Note)

	// Try to update a rule with an empty ID
	updatedRule = ignore.Rule{}
	err = store.Update(context.Background(), updatedRule)
	require.Error(t, err, "Update should fail for an empty id.")

	delCount, err = store.Delete(context.Background(), r2.ID)
	require.NoError(t, err)
	require.Equal(t, 1, delCount)

	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 0, len(allRules))

	// This id doesn't exist, so we shouldn't be able to delete it.
	delCount, err = store.Delete(context.Background(), "1000000")
	require.NoError(t, err)
	require.Equal(t, delCount, 0)
	allRules, err = store.List(context.Background())
	require.NoError(t, err)
	require.Equal(t, 0, len(allRules))
}
