package displayevent

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

	eventdata "github.com/tidbcloud/eventbus-datastruct/event"

	grpcmetadata "github.com/tidbcloud/tidb-management-service/utilities/grpc/metadata"
)

func TestNewDisplayEvent(t *testing.T) {
	ctx := grpcmetadata.AppendToOutgoingMeta(t.Context(), &grpcmetadata.RequestMeta{
		OrgID:            42,
		UserID:           "7",
		Email:            "operator@example.com",
		DefaultProjectID: 99,
		ValidProjectList: []uint64{99},
	})

	event := New(ctx, RestoreFromBackup, eventdata.EventStatusFailed, 42, 123, "restore-1", "Restore failed.", RestoreDetail{
		RestoreID:       "restore-1",
		RestoreMode:     "snapshot",
		BackupID:        "backup-1",
		TargetClusterID: "123",
	})

	if event.DisplayEventType != RestoreFromBackup {
		t.Fatalf("event type = %q, want %q", event.DisplayEventType, RestoreFromBackup)
	}
	if event.DisplayStatus != eventdata.EventStatusFailed {
		t.Fatalf("event status = %q, want %q", event.DisplayStatus, eventdata.EventStatusFailed)
	}
	if event.TenantID != 42 || event.ProjectID != 0 || event.ClusterID != 123 || event.ContextID != "restore-1" {
		t.Fatalf(
			"unexpected event ownership/context: tenant=%d project=%d cluster=%d context=%q",
			event.TenantID,
			event.ProjectID,
			event.ClusterID,
			event.ContextID,
		)
	}
	if event.Author != "operator@example.com" || event.AuthorID != 7 {
		t.Fatalf("unexpected author: %q (%d)", event.Author, event.AuthorID)
	}

	payload, err := json.Marshal(event.Detail)
	if err != nil {
		t.Fatal(err)
	}
	detailJSON := string(payload)
	if detailJSON == "" || strings.Contains(detailJSON, "token") || strings.Contains(detailJSON, "password") ||
		strings.Contains(detailJSON, "secret") ||
		strings.Contains(detailJSON, "credential") {
		t.Fatalf("detail contains sensitive/unexpected fields: %s", payload)
	}
}
