package compatibility_test

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

// TestPublishedStructUnkeyedLiteralCompatibility compiles an external consumer
// that uses the v0.1.8 exported field order. The source lives in a temporary
// module so go vet does not reject the intentionally unkeyed fixture itself.
func TestPublishedStructUnkeyedLiteralCompatibility(t *testing.T) {
	fixture := `package compatibilityfixture

import (
	"time"

	connector_inbound "github.com/pingcap-inc/nexuscrm-connectors/features/connector/inbound"
	connector_workqueue "github.com/pingcap-inc/nexuscrm-connectors/features/connector/workqueue"
)

var _ = connector_inbound.WorkerConfig{"", "", "", 0, 0, 0, 0, nil, nil, false, 0, 0, "", nil, nil, nil, 0, "", "", 0}
var _ = connector_workqueue.ClaimWorkItemInput{"", 0, "", "", "", time.Time{}, "", nil, false, time.Time{}}
`
	compileExternalConsumer(t, "v0.1.8 unkeyed-literal", fixture)
}

func compileExternalConsumer(t *testing.T, fixtureName, fixture string) {
	t.Helper()
	repoRoot, err := filepath.Abs("..")
	if err != nil {
		t.Fatalf("resolve repository root: %v", err)
	}
	fixtureDir := t.TempDir()
	goMod := "module compatibilityfixture\n\ngo 1.25\n\nrequire github.com/pingcap-inc/nexuscrm-connectors v0.0.0\n\nreplace github.com/pingcap-inc/nexuscrm-connectors => " + repoRoot + "\n"
	if err := os.WriteFile(filepath.Join(fixtureDir, "go.mod"), []byte(goMod), 0o600); err != nil {
		t.Fatalf("write fixture go.mod: %v", err)
	}
	if err := os.WriteFile(filepath.Join(fixtureDir, "fixture.go"), []byte(fixture), 0o600); err != nil {
		t.Fatalf("write fixture source: %v", err)
	}
	cmd := exec.Command("go", "test", "-mod=mod", ".")
	cmd.Dir = fixtureDir
	cmd.Env = append(os.Environ(), "GOSUMDB=off")
	if output, err := cmd.CombinedOutput(); err != nil {
		t.Fatalf("compile %s fixture: %v\n%s", fixtureName, err, output)
	}
}
