package main

import (
	"os"
	"path/filepath"
	"testing"
)

func TestEveryGenericEngineModuleIsDialectScanned(t *testing.T) {
	t.Parallel()
	for _, module := range engineModules {
		if !l0Modules[module] {
			t.Errorf("generic engine module %q is outside the L0 dialect scanner", module)
		}
	}
}

func TestL0DialectScannerInspectsWorkerProductionSource(t *testing.T) {
	t.Parallel()
	root := t.TempDir()
	workerDir := filepath.Join(root, "nexuscrm-worker")
	if err := os.MkdirAll(workerDir, 0o755); err != nil {
		t.Fatal(err)
	}
	if err := os.WriteFile(filepath.Join(workerDir, "worker.go"), []byte("package worker\n// Salesforce-specific behavior must not enter L0.\n"), 0o600); err != nil {
		t.Fatal(err)
	}
	if err := os.WriteFile(filepath.Join(workerDir, "allowed_test.go"), []byte("package worker\n// HubSpot is allowed in a test fixture.\n"), 0o600); err != nil {
		t.Fatal(err)
	}

	modules := map[string]*Module{
		"github.com/nexuscrm/worker": {
			Path:   "github.com/nexuscrm/worker",
			Dir:    workerDir,
			RelDir: "nexuscrm-worker",
		},
	}
	hits := scanL0Dialect(root, modules)
	if len(hits) != 1 {
		t.Fatalf("worker dialect hits=%+v, want one production-source hit", hits)
	}
	if hit := hits[0]; hit.File != "nexuscrm-worker/worker.go" || hit.Module != "github.com/nexuscrm/worker" ||
		len(hit.Tokens) != 1 || hit.Tokens[0] != "salesforce" {
		t.Fatalf("worker dialect hit=%+v", hit)
	}
}

func TestContainsDialectTokenUsesIdentifierSegments(t *testing.T) {
	t.Parallel()

	tests := []struct {
		name   string
		source string
		token  string
		want   bool
	}{
		{name: "qualified type", source: "models.SObject", token: "sobject", want: true},
		{name: "camel case suffix", source: "cloneAutomationSObject", token: "sobject", want: true},
		{name: "camel case prefix", source: "SObjectType", token: "sobject", want: true},
		{name: "snake case", source: "sobject_utils", token: "sobject", want: true},
		{name: "plain prose", source: "Salesforce-compatible", token: "salesforce", want: true},
		{name: "neutral camel case", source: "crossObjectFKs", token: "sobject", want: false},
		{name: "neutral lower case", source: "crossobject", token: "sobject", want: false},
		{name: "non ambiguous tokens retain substring freeze", source: "salesforceclient", token: "salesforce", want: true},
	}

	for _, test := range tests {
		test := test
		t.Run(test.name, func(t *testing.T) {
			t.Parallel()
			if got := containsDialectToken(test.source, test.token); got != test.want {
				t.Fatalf("containsDialectToken(%q, %q) = %v, want %v", test.source, test.token, got, test.want)
			}
		})
	}
}
