package regionalserver

import (
	"context"
	"net/http"
	"net/http/httptest"
	"testing"

	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
	dataplanemanagerv1 "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/dataplane-manager/v1"
)

func TestGetDataPlane(t *testing.T) {
	t.Run("success", func(t *testing.T) {
		var gotMethod, gotPath string
		srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			gotMethod = r.Method
			gotPath = r.URL.Path
			w.Header().Set("Content-Type", "application/json")
			_, _ = w.Write([]byte(`{
				"vpc": {
					"cidr": "10.0.0.0/16",
					"natIps": ["1.1.1.1", "2.2.2.2"]
				}
			}`))
		}))
		defer srv.Close()

		cli := newTestRegionalCli()
		region := newActiveRegion(srv.URL)

		resp, err := cli.GetDataPlane(context.Background(), region, &dataplanemanagerv1.GetDataPlaneRequest{
			DataPlaneId: "dp-1",
		})
		require.Nil(t, err)
		require.NotNil(t, resp)
		assert.Equal(t, http.MethodGet, gotMethod)
		assert.Equal(t, "/dataplane-manager/api/v1/dataplanes/dp-1", gotPath)
		assert.Equal(t, []string{"1.1.1.1", "2.2.2.2"}, resp.GetVpc().GetNatIps())
	})

	t.Run("not found", func(t *testing.T) {
		srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
			http.Error(w, `{"error":"not found"}`, http.StatusNotFound)
		}))
		defer srv.Close()

		cli := newTestRegionalCli()
		region := newActiveRegion(srv.URL)

		resp, err := cli.GetDataPlane(context.Background(), region, &dataplanemanagerv1.GetDataPlaneRequest{
			DataPlaneId: "dp-404",
		})
		require.Nil(t, resp)
		require.NotNil(t, err)
		assert.Contains(t, err.Error(), "dataplane not found")
	})
}
