package events_test

import (
	"encoding/json"
	"testing"

	"bit.admedia.com/scm/ad/adpilot-indexing-commit-intel.com/internal/contracts/events"
)

func TestGraphArtifactReadyEventJSONRoundTrip(t *testing.T) {
	original := events.NewGraphArtifactReadyEvent(
		"evt_graph_1",
		"ad/example",
		"snap_1",
		"abc123",
		"art_snap_1_deadbeef",
		"file:///data/artifacts/art_snap_1_deadbeef.json",
		"v0.1.0",
		"v1",
	)
	original.NodeCount = 8
	original.EdgeCount = 12

	data, err := json.Marshal(original)
	if err != nil {
		t.Fatalf("marshal: %v", err)
	}

	var decoded events.GraphArtifactReadyEvent
	if err := json.Unmarshal(data, &decoded); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}

	if decoded.EventID != original.EventID {
		t.Errorf("event_id: got %q, want %q", decoded.EventID, original.EventID)
	}
	if decoded.EventVersion != "v1" {
		t.Errorf("event_version: got %q, want v1", decoded.EventVersion)
	}
	if decoded.ArtifactURI != original.ArtifactURI {
		t.Errorf("artifact_uri: got %q, want %q", decoded.ArtifactURI, original.ArtifactURI)
	}
	if decoded.NodeCount != 8 {
		t.Errorf("node_count: got %d, want 8", decoded.NodeCount)
	}
}

func TestGraphDeltaReadyEventJSONRoundTrip(t *testing.T) {
	original := events.NewGraphDeltaReadyEvent(
		"evt_delta_1",
		"ad/example",
		"base123",
		"target456",
		"delta_target456_a1b2",
		"file:///data/artifacts/delta_target456_a1b2.json",
		"v1",
	)
	original.AddedNodes = 3
	original.RemovedNodes = 1
	original.ChangedEdges = 2

	data, err := json.Marshal(original)
	if err != nil {
		t.Fatalf("marshal: %v", err)
	}

	var decoded events.GraphDeltaReadyEvent
	if err := json.Unmarshal(data, &decoded); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}

	if decoded.BaseCommitSHA != "base123" {
		t.Errorf("base_commit_sha: got %q", decoded.BaseCommitSHA)
	}
	if decoded.TargetCommitSHA != "target456" {
		t.Errorf("target_commit_sha: got %q", decoded.TargetCommitSHA)
	}
	if decoded.AddedNodes != 3 {
		t.Errorf("added_nodes: got %d, want 3", decoded.AddedNodes)
	}
}

func TestCommitAnalysisReadyEventJSONRoundTrip(t *testing.T) {
	original := events.NewCommitAnalysisReadyEvent(
		"evt_analysis_1",
		"ad/example",
		"target456",
		"analysis_snap_1_target456",
	)
	original.ImpactedSymbols = []string{"Run", "Helper"}
	original.ChangedFiles = []string{"main.go"}
	original.Summary = "2 symbols impacted across 1 file"

	data, err := json.Marshal(original)
	if err != nil {
		t.Fatalf("marshal: %v", err)
	}

	var decoded events.CommitAnalysisReadyEvent
	if err := json.Unmarshal(data, &decoded); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}

	if decoded.AnalysisID != original.AnalysisID {
		t.Errorf("analysis_id: got %q, want %q", decoded.AnalysisID, original.AnalysisID)
	}
	if len(decoded.ImpactedSymbols) != 2 {
		t.Fatalf("impacted_symbols: got %d, want 2", len(decoded.ImpactedSymbols))
	}
	if decoded.Summary != original.Summary {
		t.Errorf("summary: got %q, want %q", decoded.Summary, original.Summary)
	}
}
