package agent

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

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

func TestNGRegionalClientListDMClusters(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, http.MethodGet, r.Method)
		require.Equal(t, "/api/premium/v1/sharedPools/42/dmClusters", r.URL.Path)
		w.Header().Set("Content-Type", "application/json")
		_, err := w.Write([]byte(`{"dmClusters":[{"id":"1","sharedPoolId":"42","phase":"AVAILABLE"},{"id":"2","sharedPoolId":"42","phase":"CREATING"}],"totalCount":2}`))
		require.NoError(t, err)
	}))
	defer server.Close()

	setTestSharedHTTPClient(t, server.Client())

	client := &NGRegionalClient{BaseUrl: server.URL}
	resp, err := client.ListDMClusters(context.Background(), 42)
	require.NoError(t, err)
	require.Len(t, resp.DMClusters, 2)
	require.Equal(t, int32(2), resp.TotalCount)
	require.Equal(t, "1", resp.DMClusters[0].Id)
	require.Equal(t, "AVAILABLE", resp.DMClusters[0].Phase)
}

func TestNGRegionalClientListDMClustersEmpty(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		require.Equal(t, http.MethodGet, r.Method)
		require.Equal(t, "/api/premium/v1/sharedPools/42/dmClusters", r.URL.Path)
		w.Header().Set("Content-Type", "application/json")
		_, err := w.Write([]byte(`{"dmClusters":[],"totalCount":0}`))
		require.NoError(t, err)
	}))
	defer server.Close()

	setTestSharedHTTPClient(t, server.Client())

	client := &NGRegionalClient{BaseUrl: server.URL}
	resp, err := client.ListDMClusters(context.Background(), 42)
	require.NoError(t, err)
	require.Empty(t, resp.DMClusters)
	require.Equal(t, int32(0), resp.TotalCount)
}

func TestRedactSharedPoolResponseForLog(t *testing.T) {
	resp := []byte(`{"id":"1","provider":{"auth_token":"secret-snake","identity_id":"id-1"}}`)
	redacted := redactSharedPoolResponseForLog(resp)
	require.NotContains(t, redacted, "secret-snake")
	require.Contains(t, redacted, "redacted")
	require.Contains(t, redacted, "id-1")

	respCamel := []byte(`{"provider":{"authToken":"secret-camel"}}`)
	redactedCamel := redactSharedPoolResponseForLog(respCamel)
	require.NotContains(t, redactedCamel, "secret-camel")
	require.Contains(t, redactedCamel, "redacted")
}
