package catalogconsumer

import (
	"bytes"
	"os"
	"path/filepath"
	"runtime"
	"strings"
	"testing"
)

func TestReaderHasNoCatalogLifecycleOrWriterDependency(t *testing.T) {
	_, file, _, ok := runtime.Caller(0)
	if !ok {
		t.Fatal("resolve test file")
	}
	packageDir := filepath.Dir(file)
	assertSourceExcludesImports(t, packageDir, []string{
		`"github.com/pingcap-inc/nexuscrm-controlplane/catalogapp"`,
		`"github.com/pingcap-inc/nexuscrm-controlplane/catalogpublication"`,
		`"github.com/pingcap-inc/nexuscrm-controlplane/internal/catalogwriter"`,
	})
	assertSourceExcludesImports(
		t,
		filepath.Join(packageDir, "..", "internal", "catalogconsumerauthority"),
		[]string{`"github.com/pingcap-inc/nexuscrm-controlplane/`},
	)
}

func assertSourceExcludesImports(t *testing.T, packageDir string, forbidden []string) {
	t.Helper()
	entries, err := os.ReadDir(packageDir)
	if err != nil {
		t.Fatal(err)
	}
	for _, entry := range entries {
		if entry.IsDir() || !strings.HasSuffix(entry.Name(), ".go") ||
			strings.HasSuffix(entry.Name(), "_test.go") {
			continue
		}
		raw, err := os.ReadFile(filepath.Join(packageDir, entry.Name()))
		if err != nil {
			t.Fatal(err)
		}
		for _, blocked := range forbidden {
			if bytes.Contains(raw, []byte(blocked)) {
				t.Fatalf(
					"consumer facade source %s contains forbidden lifecycle or writer dependency %q",
					entry.Name(), blocked,
				)
			}
		}
	}
}
