package controlplane

import (
	"bufio"
	"os"
	"regexp"
	"sort"
	"strings"
	"testing"
)

var (
	coreRequirePattern = regexp.MustCompile(`^\s*(github\.com/nexuscrm/\S+)\s+v0\.0\.0(?:\s+// indirect)?\s*$`)
	coreReplacePattern = regexp.MustCompile(`^replace\s+(github\.com/nexuscrm/\S+)\s+=>\s+github\.com/pingcap-inc/NexusCRM/\S+\s+(v0\.0\.0-\d{14}-[0-9a-f]{12})\s*$`)
)

// TestCoreModuleReplacementsUseOneSourceReleaseClosure prevents the
// independently released control plane from assembling NexusCRM's mutually
// recursive core modules from different source revisions. Those modules are
// one architecture/release closure even though Go resolves them as separate
// module paths.
func TestCoreModuleReplacementsUseOneSourceReleaseClosure(t *testing.T) {
	data, err := os.ReadFile("go.mod")
	if err != nil {
		t.Fatalf("read go.mod: %v", err)
	}

	required := make(map[string]struct{})
	replaced := make(map[string]string)
	scanner := bufio.NewScanner(strings.NewReader(string(data)))
	for scanner.Scan() {
		line := scanner.Text()
		if match := coreRequirePattern.FindStringSubmatch(line); match != nil {
			required[match[1]] = struct{}{}
		}
		if match := coreReplacePattern.FindStringSubmatch(line); match != nil {
			if previous, exists := replaced[match[1]]; exists {
				t.Fatalf("duplicate replacement for %s: %s and %s", match[1], previous, match[2])
			}
			replaced[match[1]] = match[2]
		}
	}
	if err := scanner.Err(); err != nil {
		t.Fatalf("scan go.mod: %v", err)
	}
	if len(required) == 0 {
		t.Fatal("no github.com/nexuscrm core modules found in go.mod")
	}

	modules := make([]string, 0, len(replaced))
	for module := range replaced {
		modules = append(modules, module)
	}
	sort.Strings(modules)

	var closureVersion string
	for _, module := range modules {
		version := replaced[module]
		if closureVersion == "" {
			closureVersion = version
			continue
		}
		if version != closureVersion {
			t.Errorf("%s uses %s; core source-release closure uses %s", module, version, closureVersion)
		}
	}
	for module := range required {
		if _, ok := replaced[module]; !ok {
			t.Errorf("%s has no remote github.com/pingcap-inc/NexusCRM replacement", module)
		}
	}
}
