package events_test

import (
	"encoding/json"
	"testing"

	"bit.admedia.com/scm/ad/adpilot-indexing-repo-sync.com/internal/contracts/events"
)

func TestFileChangedEventJSONRoundTrip(t *testing.T) {
	original := events.NewFileChangedEvent(
		"evt_1",
		"company/payment-service",
		"snap_1",
		"a3f9c12b",
		"src/payments/processor.go",
		"go",
		events.FileKindCode,
		events.ChangeTypeModified,
	)

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

	var decoded events.FileChangedEvent
	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.RepoID != original.RepoID {
		t.Errorf("repo_id: got %q, want %q", decoded.RepoID, original.RepoID)
	}
	if decoded.FilePath != original.FilePath {
		t.Errorf("file_path: got %q, want %q", decoded.FilePath, original.FilePath)
	}
	if decoded.FileKind != events.FileKindCode {
		t.Errorf("file_kind: got %q, want code", decoded.FileKind)
	}
	if decoded.ChangeType != events.ChangeTypeModified {
		t.Errorf("change_type: got %q, want modified", decoded.ChangeType)
	}
}

func TestFileKindIsValid(t *testing.T) {
	if !events.FileKindCode.IsValid() {
		t.Fatal("expected code to be valid")
	}
	if events.FileKind("invalid").IsValid() {
		t.Fatal("expected invalid file kind to be rejected")
	}
}

func TestChangeTypeIsValid(t *testing.T) {
	if !events.ChangeTypeAdded.IsValid() {
		t.Fatal("expected added to be valid")
	}
	if events.ChangeType("copied").IsValid() {
		t.Fatal("expected invalid change type to be rejected")
	}
}
