package wire

import (
	"go/parser"
	"go/token"
	"os"
	"path/filepath"
	"strconv"
	"strings"
	"testing"
)

func TestModuleIsSelfContainedL1WireCodec(t *testing.T) {
	module, err := os.ReadFile("go.mod")
	if err != nil {
		t.Fatal(err)
	}
	text := string(module)
	if !strings.Contains(text, "module github.com/pingcap-inc/nexuscrm-app-packs/sfcrm/wire") {
		t.Fatalf("unexpected module declaration:\n%s", text)
	}
	if strings.Contains(text, "require ") || strings.Contains(text, "replace ") || strings.Contains(text, "require (") || strings.Contains(text, "replace (") {
		t.Fatalf("codec must remain stdlib-only:\n%s", text)
	}

	files := token.NewFileSet()
	err = filepath.Walk(".", func(path string, info os.FileInfo, walkErr error) error {
		if walkErr != nil {
			return walkErr
		}
		if info.IsDir() || filepath.Ext(path) != ".go" {
			return nil
		}
		parsed, parseErr := parser.ParseFile(files, path, nil, parser.ImportsOnly)
		if parseErr != nil {
			return parseErr
		}
		for _, imported := range parsed.Imports {
			value, unquoteErr := strconv.Unquote(imported.Path.Value)
			if unquoteErr != nil {
				return unquoteErr
			}
			if strings.Contains(value, ".") {
				t.Errorf("%s imports non-stdlib dependency %q", path, value)
			}
		}
		return nil
	})
	if err != nil {
		t.Fatal(err)
	}
}
