package repos

import (
	"errors"
	"testing"

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

func TestResolveRepositoryStorageUsesRawPrincipalForPersonalOwner(t *testing.T) {
	storage, err := ResolveRepositoryStorage("workspace_1", "usr_with_underscore", "")

	require.NoError(t, err)
	require.Equal(t, RepositoryStorageScopePersonal, storage.Scope)
	require.Equal(t, "usr_with_underscore", storage.OwnerLogin)
	require.Equal(t, RepositoryStorageScopePersonal, storage.OwnerKind)
}

func TestResolveRepositoryStorageUsesRawWorkspaceForWorkspaceOwner(t *testing.T) {
	storage, err := ResolveRepositoryStorage("workspace_with_underscore", "usr_1", RepositoryStorageScopeWorkspace)

	require.NoError(t, err)
	require.Equal(t, RepositoryStorageScopeWorkspace, storage.Scope)
	require.Equal(t, "workspace_with_underscore", storage.OwnerLogin)
	require.Equal(t, RepositoryStorageScopeWorkspace, storage.OwnerKind)
}

func TestResolveRepositoryStorageRejectsMissingPersonalSubject(t *testing.T) {
	_, err := ResolveRepositoryStorage("workspace_1", " ", RepositoryStorageScopePersonal)

	require.Error(t, err)
	require.True(t, errors.Is(err, ErrUnauthorized))
}

func TestResolveRepositoryStorageRejectsUnknownScope(t *testing.T) {
	_, err := ResolveRepositoryStorage("workspace_1", "usr_1", "team")

	require.Error(t, err)
	require.True(t, errors.Is(err, ErrInvalidArgument))
}

func TestRepositoryAlreadyExistsConflictSuggestsNextStem(t *testing.T) {
	err := RepositoryAlreadyExistsConflict("usr_1/runbooks.sk", "skill_repository", "sk_1", "primary", RepositoryNameFieldName, "runbooks")

	require.ErrorIs(t, err, ErrConflict)
	require.Equal(t, RepositoryAlreadyExistsCode, Code(err))
	details, ok := Details(err).(RepositoryNameConflictDetails)
	require.True(t, ok)
	require.Equal(t, "usr_1/runbooks.sk", details.RepoFullName)
	require.Equal(t, "runbooks-2", details.SuggestedRepoName)
}
