package compatibility_test

import (
	"context"
	"net"
	"testing"
	"time"

	runtimev1 "github.com/pingcap-inc/nexuscrm-contract/wire-go/gen/runtime/v1"
	"google.golang.org/grpc"
	"google.golang.org/grpc/codes"
	"google.golang.org/grpc/credentials/insecure"
	"google.golang.org/grpc/status"
	"google.golang.org/grpc/test/bufconn"
)

type nMinusOneFlowExecutionServer struct {
	runtimev1.UnimplementedFlowExecutionServiceServer
}

func (*nMinusOneFlowExecutionServer) ExecuteFlow(
	context.Context,
	*runtimev1.ExecuteFlowRequest,
) (*runtimev1.ExecuteFlowResponse, error) {
	return &runtimev1.ExecuteFlowResponse{}, nil
}

func TestCatalogActionPreviewIsAdditiveAgainstNMinusOneServer(t *testing.T) {
	listener := bufconn.Listen(1024 * 1024)
	server := grpc.NewServer()
	runtimev1.RegisterFlowExecutionServiceServer(server, &nMinusOneFlowExecutionServer{})
	go func() {
		_ = server.Serve(listener)
	}()
	t.Cleanup(func() {
		server.Stop()
		_ = listener.Close()
	})

	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	connection, err := grpc.DialContext(
		ctx,
		"bufnet",
		grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) {
			return listener.Dial()
		}),
		grpc.WithTransportCredentials(insecure.NewCredentials()),
	)
	if err != nil {
		t.Fatal(err)
	}
	defer connection.Close()

	response, err := runtimev1.NewFlowExecutionServiceClient(connection).
		PreviewCatalogAction(ctx, &runtimev1.PreviewCatalogActionRequest{})
	if response != nil || status.Code(err) != codes.Unimplemented {
		t.Fatalf("N-1 preview response = %#v, error = %v", response, err)
	}
}
