//go:build integration
// +build integration

package sqlite_test

import (
	"context"
	"testing"

	"github.com/stashapp/stash/pkg/models"
	"github.com/stretchr/testify/assert"
)

type stashIDReaderWriter interface {
	GetStashIDs(ctx context.Context, performerID int) ([]models.StashID, error)
	UpdateStashIDs(ctx context.Context, performerID int, stashIDs []models.StashID) error
}

func testStashIDReaderWriter(ctx context.Context, t *testing.T, r stashIDReaderWriter, id int) {
	// ensure no stash IDs to begin with
	testNoStashIDs(ctx, t, r, id)

	// ensure GetStashIDs with non-existing also returns none
	testNoStashIDs(ctx, t, r, -1)

	// add stash ids
	const stashIDStr = "stashID"
	const endpoint = "endpoint"
	stashID := models.StashID{
		StashID:  stashIDStr,
		Endpoint: endpoint,
	}

	// update stash ids and ensure was updated
	if err := r.UpdateStashIDs(ctx, id, []models.StashID{stashID}); err != nil {
		t.Error(err.Error())
	}

	testStashIDs(ctx, t, r, id, []models.StashID{stashID})

	// update non-existing id - should return error
	if err := r.UpdateStashIDs(ctx, -1, []models.StashID{stashID}); err == nil {
		t.Error("expected error when updating non-existing id")
	}

	// remove stash ids and ensure was updated
	if err := r.UpdateStashIDs(ctx, id, []models.StashID{}); err != nil {
		t.Error(err.Error())
	}

	testNoStashIDs(ctx, t, r, id)
}

func testNoStashIDs(ctx context.Context, t *testing.T, r stashIDReaderWriter, id int) {
	t.Helper()
	stashIDs, err := r.GetStashIDs(ctx, id)
	if err != nil {
		t.Error(err.Error())
		return
	}

	assert.Len(t, stashIDs, 0)
}

func testStashIDs(ctx context.Context, t *testing.T, r stashIDReaderWriter, id int, expected []models.StashID) {
	t.Helper()
	stashIDs, err := r.GetStashIDs(ctx, id)
	if err != nil {
		t.Error(err.Error())
		return
	}

	assert.Equal(t, stashIDs, expected)
}
