package analytics

import (
	"context"
	"testing"

	"github.com/nexuscrm/shared/pkg/constants"
	"github.com/nexuscrm/shared/pkg/models"
	"github.com/stretchr/testify/assert"
)

// --- getLookupIdField tests ---

func TestGetLookupIdField(t *testing.T) {
	t.Run("always returns constants.FieldID", func(t *testing.T) {
		schema := &models.ObjectMetadata{
			APIName: "Account",
			Fields:  []models.FieldMetadata{{APIName: "Id"}, {APIName: "Name"}},
		}
		assert.Equal(t, constants.FieldID, getLookupIdField(schema))
	})

	t.Run("returns FieldID regardless of schema content", func(t *testing.T) {
		schema := &models.ObjectMetadata{
			APIName: "CustomObj",
			Fields:  []models.FieldMetadata{},
		}
		assert.Equal(t, constants.FieldID, getLookupIdField(schema))
	})
}

// --- requestIDFromCtx tests ---

func TestRequestIDFromCtx(t *testing.T) {
	t.Run("returns request ID from context", func(t *testing.T) {
		ctx := context.WithValue(context.Background(), constants.ContextKeyRequestID, "req-123")
		assert.Equal(t, "req-123", requestIDFromCtx(ctx))
	})

	t.Run("returns empty string when not set", func(t *testing.T) {
		assert.Equal(t, "", requestIDFromCtx(context.Background()))
	})

	t.Run("returns empty string for wrong type", func(t *testing.T) {
		ctx := context.WithValue(context.Background(), constants.ContextKeyRequestID, 12345)
		assert.Equal(t, "", requestIDFromCtx(ctx))
	})
}

// --- queryUserID tests ---

func TestQueryUserID(t *testing.T) {
	t.Run("returns user ID", func(t *testing.T) {
		user := &models.UserSession{ID: "user-abc"}
		assert.Equal(t, "user-abc", queryUserID(user))
	})

	t.Run("returns system for nil user", func(t *testing.T) {
		assert.Equal(t, "system", queryUserID(nil))
	})
}
