package streaming_api_test

import (
	"encoding/json"
	"net/http"
	"strings"
	"testing"

	"github.com/nexuscrm/tests/contract/internal/liveapi"
	"github.com/stretchr/testify/require"
)

func TestPostHandshake(t *testing.T) {
	cfg := liveapi.LoadConfig(t)
	client := liveapi.NewAuthenticatedClient(t)
	version := strings.TrimPrefix(cfg.APIVersion, "v")

	testCases := []struct {
		name string
		body []map[string]any
	}{
		{
			name: "bayeux handshake",
			body: []map[string]any{
				{
					"channel":                  "/meta/handshake",
					"version":                  "1.0",
					"minimumVersion":           "1.0",
					"supportedConnectionTypes": []string{"long-polling"},
				},
			},
		},
		{
			name: "empty array still provisions session",
			body: []map[string]any{},
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			resp, err := client.DoJSON(http.MethodPost, cfg.RootBaseURL+"/cometd/"+version+"/handshake", tc.body)
			require.NoError(t, err)
			if cfg.TargetName == "sandbox" && resp.StatusCode == http.StatusNotFound {
				t.Skip("Salesforce sandbox does not expose the backend-specific split /handshake route")
			}
			require.Equal(t, http.StatusOK, resp.StatusCode)

			raw := liveapi.ReadBody(t, resp)
			if len(raw) == 0 {
				if cfg.TargetName == "sandbox" && tc.name == "empty array still provisions session" {
					t.Skip("Salesforce sandbox accepts the split handshake route but returns an empty body for an empty-array payload")
				}
				t.Fatalf("expected handshake response body")
			}
			var body []struct {
				Channel                  string   `json:"channel"`
				Version                  string   `json:"version"`
				SupportedConnectionTypes []string `json:"supportedConnectionTypes"`
				ClientID                 string   `json:"clientId"`
				Successful               bool     `json:"successful"`
			}
			require.NoError(t, json.Unmarshal(raw, &body))

			require.Len(t, body, 1)
			require.Equal(t, "/meta/handshake", body[0].Channel)
			require.Equal(t, "1.0", body[0].Version)
			require.True(t, body[0].Successful)
			require.NotEmpty(t, body[0].ClientID)
			require.Contains(t, body[0].SupportedConnectionTypes, "long-polling")
		})
	}
}
