package analytics_api_test

import (
	"net/http"
	"testing"

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

func TestGetFolders(t *testing.T) {
	client := liveapi.NewAuthenticatedClient(t)

	testCases := []struct {
		name        string
		path        string
		maxPageSize int
	}{
		{
			name:        "default list",
			path:        "/folders",
			maxPageSize: 10,
		},
		{
			name:        "page size one",
			path:        "/folders?pageSize=1",
			maxPageSize: 1,
		},
	}

	for _, tc := range testCases {
		t.Run(tc.name, func(t *testing.T) {
			resp, err := client.DoJSON(http.MethodGet, tc.path, nil)
			require.NoError(t, err)
			require.Equal(t, http.StatusOK, resp.StatusCode)

			var body struct {
				Folders     []map[string]any `json:"folders"`
				HasNextPage bool             `json:"hasNextPage"`
				NextPageURL string           `json:"nextPageUrl"`
				TotalSize   int              `json:"totalSize"`
				URL         string           `json:"url"`
			}
			liveapi.DecodeJSON(t, resp, &body)

			require.NotNil(t, body.Folders)
			if body.TotalSize > 0 && tc.maxPageSize > 0 {
				require.LessOrEqual(t, len(body.Folders), tc.maxPageSize)
				require.GreaterOrEqual(t, body.TotalSize, len(body.Folders))
			}
			if body.URL != "" {
				require.Contains(t, body.URL, "/folders")
			}
			if body.NextPageURL != "" {
				require.Contains(t, body.NextPageURL, "/services/data/v63.0/folders")
			}
			for _, folder := range body.Folders {
				require.NotEmpty(t, folder["id"])
				require.NotEmpty(t, folder["name"])
			}
		})
	}
}
