package globalnextgencli

import (
	"errors"
	"testing"

	"github.com/stretchr/testify/require"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/status"

	"github.com/tidbcloud/tidb-management-service/utilities/bizerr"
)

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

	tests := []struct {
		name string
		err  error
		want bizerr.ErrCode
	}{
		{name: "canceled", err: status.Error(codes.Canceled, "canceled"), want: bizerr.ErrCode(codes.Canceled)},
		{name: "invalid argument", err: status.Error(codes.InvalidArgument, "invalid"), want: bizerr.ErrCode(codes.InvalidArgument)},
		{name: "not found", err: status.Error(codes.NotFound, "missing"), want: bizerr.ErrCode(codes.NotFound)},
		{name: "resource exhausted", err: status.Error(codes.ResourceExhausted, "quota"), want: bizerr.ErrCode(codes.ResourceExhausted)},
		{name: "internal", err: status.Error(codes.Internal, "internal"), want: bizerr.ErrCode(codes.Internal)},
		{name: "unavailable", err: status.Error(codes.Unavailable, "unavailable"), want: bizerr.ErrCode(codes.Unavailable)},
		{name: "deadline", err: status.Error(codes.DeadlineExceeded, "deadline"), want: bizerr.ErrCode(codes.Unavailable)},
		{name: "failed precondition", err: status.Error(codes.FailedPrecondition, "not ready"), want: bizerr.ErrCode(codes.Unavailable)},
		{name: "unimplemented", err: status.Error(codes.Unimplemented, "old global"), want: bizerr.ErrCode(codes.Unavailable)},
		{name: "transport", err: errors.New("connection reset"), want: bizerr.ErrCode(codes.Unavailable)},
	}

	for _, test := range tests {
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			var result bizerr.BizError
			require.ErrorAs(t, normalizeResourcePoolCIDRRegionError(test.err, "PlanResourcePoolCidr"), &result)
			require.Equal(t, test.want, result.ErrCode())
		})
	}
}
