package buildverify

import (
	"io/fs"
	"os"
	"os/exec"
	"path/filepath"
	"testing"

	"github.com/stretchr/testify/require"
)

func TestWebassetsEmbedModuleIsAbsent(t *testing.T) {
	for _, relative := range []string{
		"webassets/embed.go",
		"webassets/embed_stub.go",
		"webassets/go.mod",
	} {
		_, err := os.Stat(filepath.Join(repoRoot(t), relative))
		require.ErrorIs(t, err, fs.ErrNotExist)
	}
}

func TestLegacyConsoleRoutesAndHandlersAreAbsent(t *testing.T) {
	router := readFile(t, filepath.Join(desktopRoot(t), "internal", "api", "router.go"))
	require.NotContains(t, router, "/bundles/"+`console`)
	_, err := os.Stat(filepath.Join(desktopRoot(t), "internal", "api", "dashboard", "api_"+`console`+"_events.go"))
	require.ErrorIs(t, err, fs.ErrNotExist)
}

func TestLocalMachineConsoleCapabilityIsAbsent(t *testing.T) {
	assertGitGrepAbsent(t, "localMachine"+"Console", []string{
		"desktop/internal/api",
		"web/src",
	})
}

func TestLegacyDesktopWebReferencesAreAbsent(t *testing.T) {
	assertGitGrepAbsent(t, "webassets/"+`src`, []string{"."})
	assertGitGrepAbsent(t, "webassets/"+`package.json`, []string{"."})
}

func assertGitGrepAbsent(t *testing.T, needle string, roots []string) {
	t.Helper()
	args := []string{"grep", "-n", "-I", "-i", "--", needle, "--"}
	args = append(args, roots...)
	args = append(args,
		":(exclude)desktop/internal/buildverify/**",
	)
	cmd := exec.Command("git", args...)
	cmd.Dir = repoRoot(t)
	output, err := cmd.CombinedOutput()
	if err == nil {
		t.Fatalf("forbidden reference %q remains:\n%s", needle, output)
	}
	var exitErr *exec.ExitError
	require.ErrorAs(t, err, &exitErr)
	require.Equal(t, 1, exitErr.ExitCode(), "git grep failed: %s", output)
}
