package webhook_test

import (
	"encoding/json"
	"os"
	"path/filepath"
	"testing"

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

func loadFixture(t *testing.T, name string) []byte {
	t.Helper()
	path := filepath.Join("..", "..", "webhook", "testdata", name)
	data, err := os.ReadFile(path)
	if err != nil {
		t.Fatalf("read fixture %s: %v", name, err)
	}
	return data
}

func TestRefsChangedEvent_ChangesPayload(t *testing.T) {
	var event webhookcontract.RefsChangedEvent
	if err := json.Unmarshal(loadFixture(t, "refs_changed_master.json"), &event); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}
	if event.EventKey != webhookcontract.EventRefsChanged {
		t.Fatalf("eventKey: got %q", event.EventKey)
	}

	repoID, err := event.RepoID()
	if err != nil {
		t.Fatalf("RepoID: %v", err)
	}
	if repoID != "ad/adpilot-indexing-repo-sync.com" {
		t.Fatalf("repoID: got %q", repoID)
	}

	master := event.MasterChanges()
	if len(master) != 1 {
		t.Fatalf("master changes: got %d, want 1", len(master))
	}
	if master[0].ToHash != "178864a7d521b6f5e720b386b2c2b0ef8563e0dc" {
		t.Fatalf("toHash: got %q", master[0].ToHash)
	}
}

func TestRefsChangedEvent_RefChangesPayload(t *testing.T) {
	var event webhookcontract.RefsChangedEvent
	if err := json.Unmarshal(loadFixture(t, "refs_changed_feature_branch.json"), &event); err != nil {
		t.Fatalf("unmarshal: %v", err)
	}

	repoID, err := event.RepoID()
	if err != nil {
		t.Fatalf("RepoID: %v", err)
	}
	if repoID != "ad/example-repo" {
		t.Fatalf("repoID: got %q", repoID)
	}
	if len(event.MasterChanges()) != 0 {
		t.Fatalf("expected no master changes, got %d", len(event.MasterChanges()))
	}
}

func TestRefsChangedEvent_RepoIDMissingFields(t *testing.T) {
	event := webhookcontract.RefsChangedEvent{}
	if _, err := event.RepoID(); err == nil {
		t.Fatal("expected error for missing repository fields")
	}
}
