package telemetry

import (
	"encoding/json"
	"testing"
	"time"

	"github.com/databricks/cli/integration/internal/acc"
	"github.com/databricks/cli/libs/telemetry"
	"github.com/databricks/cli/libs/telemetry/protos"
	"github.com/databricks/databricks-sdk-go/client"
	"github.com/google/uuid"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestTelemetryEndpoint(t *testing.T) {
	ctx, wt := acc.WorkspaceTest(t)
	w := wt.W

	apiClient, err := client.New(w.Config)
	require.NoError(t, err)

	logs := []protos.FrontendLog{
		{
			FrontendLogEventID: uuid.New().String(),
			Entry: protos.FrontendLogEntry{
				DatabricksCliLog: protos.DatabricksCliLog{
					CliTestEvent: &protos.CliTestEvent{Name: protos.DummyCliEnumValue1},
				},
			},
		},
		{
			FrontendLogEventID: uuid.New().String(),
			Entry: protos.FrontendLogEntry{
				DatabricksCliLog: protos.DatabricksCliLog{
					CliTestEvent: &protos.CliTestEvent{Name: protos.DummyCliEnumValue2},
				},
			},
		},
	}

	protoLogs := make([]string, len(logs))
	for i, log := range logs {
		b, err := json.Marshal(log)
		require.NoError(t, err)
		protoLogs[i] = string(b)
	}

	reqB := telemetry.RequestBody{
		UploadTime: time.Now().UnixMilli(),
		Items:      []string{},
		ProtoLogs:  protoLogs,
	}

	respB := telemetry.ResponseBody{}

	err = apiClient.Do(ctx, "POST", "/telemetry-ext", nil, nil, reqB, &respB)
	require.NoError(t, err)

	assert.Equal(t, telemetry.ResponseBody{
		Errors:          []telemetry.LogError{},
		NumProtoSuccess: int64(2),
	}, respB)
}