package route

import (
	"context"
	"fmt"
	"os"
	"testing"

	"github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/kong"
	"github.com/kong/kubernetes-testing-framework/pkg/clusters/addons/metallb"
	"github.com/kong/kubernetes-testing-framework/pkg/environments"
)

func TestMain(m *testing.M) {
	fmt.Println("test case start running")
	ctx, cancel = context.WithCancel(context.Background())
	defer cancel()

	fmt.Println("INFO: setting up test environment")
	kongbuilder := kong.NewBuilder().WithProxyImage(
		"gcr.io/pingcap-public/pingcap/kong", "2.8").WithControllerImage(
		"gcr.io/pingcap-public/pingcap/kong/kubernetes-ingress-controller", "2.8")
	kongAddon := kongbuilder.Build()
	builder := environments.NewBuilder().WithAddons(kongAddon).WithAddons(metallb.New())

	fmt.Println("INFO: building test environment")
	var err error
	env, err = builder.Build(ctx)
	exitOnErr(err)
	clusterVersion, err = env.Cluster().Version()
	exitOnErr(err)

	fmt.Printf("INFO: waiting for cluster %s and all addons to become ready\n", env.Cluster().Name())
	exitOnErr(<-env.WaitForReady(ctx))

	fmt.Println("INFO: collecting urls from the kong proxy deployment")
	proxyURL, err = kongAddon.ProxyURL(ctx, env.Cluster())
	fmt.Println("INFO: proxy url is: ", proxyURL)
	exitOnErr(err)

	fmt.Printf("INFO: testing environment is ready KUBERNETES_VERSION=(%v): running tests\n", clusterVersion)
	code := m.Run()

	ctx, cancel = context.WithTimeout(context.Background(), environmentCleanupTimeout)
	defer cancel()
	fmt.Printf("INFO: cluster %s is being deleted\n", env.Cluster().Name())
	exitOnErr(env.Cleanup(ctx))

	os.Exit(code)
}
