package git_test

import (
	"encoding/json"
	"testing"

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

func TestSyncResultJSONRoundTrip(t *testing.T) {
	original := gitcontract.SyncResult{
		Snapshot: gitcontract.RepositorySnapshot{
			RepoID:     "ad/example-repo",
			SnapshotID: "snap_abc123",
			CommitSHA:  "deadbeef",
			Ref:        "main",
			Status:     gitcontract.SnapshotStatusReady,
		},
		FileChanges: []gitcontract.FileChange{
			{
				Path:       "internal/config/config.go",
				ChangeType: events.ChangeTypeAdded,
				Language:   "go",
				FileKind:   events.FileKindCode,
			},
		},
		CommitChanges: []gitcontract.CommitChange{
			{CommitSHA: "deadbeef", ParentSHA: "cafebabe"},
		},
		IsFirstSync: true,
	}

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

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

	if decoded.Snapshot.RepoID != original.Snapshot.RepoID {
		t.Errorf("repo_id: got %q, want %q", decoded.Snapshot.RepoID, original.Snapshot.RepoID)
	}
	if len(decoded.FileChanges) != 1 {
		t.Fatalf("file_changes len: got %d, want 1", len(decoded.FileChanges))
	}
	if decoded.FileChanges[0].ChangeType != events.ChangeTypeAdded {
		t.Errorf("change_type: got %q, want %q", decoded.FileChanges[0].ChangeType, events.ChangeTypeAdded)
	}
	if !decoded.IsFirstSync {
		t.Error("expected is_first_sync true")
	}
}
