package project

import (
	"context"
	"testing"

	"github.com/stretchr/testify/require"
	"go.uber.org/mock/gomock"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	projectv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/api/agent-sidecar/project/v1"
	projectentityv1 "github.com/tidbcloud/aisupport/packages/sdk-go/contracts/entity/agent-sidecar/project/v1"
	projectapi "github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services/project/api"
	projecterror "github.com/tidbcloud/aisupport/services/agent-sidecar/internal/services/project/projecterror"
)

func TestHandlerListProjects(t *testing.T) {
	t.Parallel()

	service := projectapi.NewMockService(gomock.NewController(t))
	service.EXPECT().ListProjects(gomock.Any()).Return(
		[]*projectentityv1.Project{{Name: "demo", GitInitialized: true}}, nil,
	)
	handler := &Handler{service: service}

	response, err := handler.ListProjects(context.Background(), &projectv1.ListProjectsRequest{})

	require.NoError(t, err)
	require.Equal(t, "demo", response.Projects[0].Name)
}

func TestHandlerErrorMapping(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name string
		err  error
		code codes.Code
	}{
		{name: "invalid", err: projecterror.ErrInvalidArgument, code: codes.InvalidArgument},
		{name: "not found", err: projecterror.ErrNotFound, code: codes.NotFound},
		{name: "exists", err: projecterror.ErrAlreadyExists, code: codes.AlreadyExists},
		{name: "denied", err: projecterror.ErrPermissionDenied, code: codes.PermissionDenied},
		{name: "conflict", err: projecterror.ErrConflict, code: codes.Aborted},
		{name: "exhausted", err: projecterror.ErrResourceExhausted, code: codes.ResourceExhausted},
		{name: "precondition", err: projecterror.ErrFailedPrecondition, code: codes.FailedPrecondition},
	}
	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			require.Equal(t, test.code, status.Code(grpcError(test.err)))
		})
	}
}
