// Package integration runs envtest-based admission tests for the Autoscaler
// CRD schema (design revision 539 §3). Run via `make test/envtest`.
package integration

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

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

	"k8s.io/apimachinery/pkg/runtime"
	clientgoscheme "k8s.io/client-go/kubernetes/scheme"
	"k8s.io/client-go/rest"
	"sigs.k8s.io/controller-runtime/pkg/client"
	"sigs.k8s.io/controller-runtime/pkg/envtest"

	"github.com/tidbcloud/cluster-service-ng/internal/capacity-planner/api/v1alpha1"
)

func schemeForTest() *runtime.Scheme {
	s := runtime.NewScheme()
	if err := clientgoscheme.AddToScheme(s); err != nil {
		panic(err)
	}
	if err := v1alpha1.AddToScheme(s); err != nil {
		panic(err)
	}
	return s
}

var (
	testEnv    *envtest.Environment
	testCfg    *rest.Config
	testClient client.Client
)

func TestMain(m *testing.M) {
	// Plain `go test ./...` has no envtest assets; the suite runs via
	// `make test/envtest` which sets KUBEBUILDER_ASSETS.
	if os.Getenv("KUBEBUILDER_ASSETS") == "" {
		_, _ = os.Stderr.WriteString("KUBEBUILDER_ASSETS not set; skipping envtest integration suite (run make test/envtest)\n")
		os.Exit(0)
	}
	testEnv = &envtest.Environment{
		CRDDirectoryPaths:     []string{filepath.Join("..", "..", "config", "crd", "bases")},
		ErrorIfCRDPathMissing: true,
	}
	cfg, err := testEnv.Start()
	if err != nil {
		panic(err)
	}
	testCfg = cfg
	testClient, err = client.New(cfg, client.Options{Scheme: schemeForTest()})
	if err != nil {
		panic(err)
	}
	ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: "dp-x"}}
	if err := testClient.Create(context.Background(), ns); err != nil {
		panic(err)
	}
	code := m.Run()
	_ = testEnv.Stop()
	os.Exit(code)
}
