package agentmemory

import (
	"context"
	"encoding/json"
	"net/http"
	"net/http/httptest"
	"testing"
	"time"

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

func TestMeshXProvisionerEnableAgentCloudMemoryWireContract(t *testing.T) {
	var gotPath string
	var gotWorkspace string
	var gotTrustedJWT string
	var gotAuth string
	var gotBody enableRequest
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		gotPath = r.URL.Path
		gotWorkspace = r.Header.Get(meshXWorkspaceHeader)
		gotTrustedJWT = r.Header.Get(meshXTrustedJWTHeader)
		gotAuth = r.Header.Get("Authorization")
		require.NoError(t, json.NewDecoder(r.Body).Decode(&gotBody))
		w.WriteHeader(http.StatusOK)
		_, _ = w.Write([]byte(`{"id":"mem_1"}`))
	}))
	defer server.Close()

	provisioner := NewMeshXProvisioner(MeshXProvisionerOptions{
		BaseURL:    server.URL + "/meshx",
		HTTPClient: server.Client(),
		TokenTTL:   time.Minute,
		Now:        func() time.Time { return time.Unix(1000, 0) },
	})
	require.NotNil(t, provisioner)

	err := provisioner.EnableAgentCloudMemory(context.Background(), EnableInput{
		UserID:                     " usr_1 ",
		WorkspaceID:                " wsp_1 ",
		AgentID:                    " agt_1 ",
		TemplateLocale:             " zh-CN ",
		ImportExistingLocalContent: true,
	})
	require.NoError(t, err)
	require.Equal(t, "/meshx/api/v1/memory/agents/agt_1/cloud-memory", gotPath)
	require.Equal(t, "wsp_1", gotWorkspace)
	require.NotEmpty(t, gotTrustedJWT)
	require.Equal(t, gotTrustedJWT, gotAuth)
	require.Equal(t, enableRequest{ImportExistingLocalContent: true, TemplateLocale: "zh-CN"}, gotBody)
}

func TestMeshXProvisionerEnableAgentCloudMemoryReturnsDependencyStatus(t *testing.T) {
	server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
		http.Error(w, `{"message":"quota exceeded"}`, http.StatusConflict)
	}))
	defer server.Close()
	provisioner := NewMeshXProvisioner(MeshXProvisionerOptions{BaseURL: server.URL, HTTPClient: server.Client()})
	require.NotNil(t, provisioner)

	err := provisioner.EnableAgentCloudMemory(context.Background(), EnableInput{
		UserID:      "usr_1",
		WorkspaceID: "wsp_1",
		AgentID:     "agt_1",
	})
	var dependencyErr DependencyError
	require.ErrorAs(t, err, &dependencyErr)
	require.Equal(t, http.StatusConflict, dependencyErr.Status)
	require.Contains(t, dependencyErr.Message, "quota exceeded")
}
