package utils

import (
	"context"
	"time"

	"k8s.io/client-go/rest"

	observabilitypingcapcomv1 "github.com/tidbcloud/observability/api/regionalserver/resourceworker/v1"
	"k8s.io/apimachinery/pkg/runtime"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
	"k8s.io/client-go/kubernetes"
	clientgoscheme "k8s.io/client-go/kubernetes/scheme"

	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

var scheme = runtime.NewScheme()

type ClientGroup struct {
	KubeClient *kubernetes.Clientset
	KubeConfig *rest.Config
	Client     client.Client
}

func init() {
	utilruntime.Must(clientgoscheme.AddToScheme(scheme))
	utilruntime.Must(observabilitypingcapcomv1.AddToScheme(scheme))
}

func PrepareKubeClient(kubeConfig *rest.Config) ClientGroup {
	clientGroup := ClientGroup{}
	var err error
	kubeClient, err := kubernetes.NewForConfig(kubeConfig)
	if err != nil {
		panic(err)
	}
	clientGroup.KubeClient = kubeClient

	mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
		Scheme:           scheme,
		LeaderElection:   false,
		LeaderElectionID: "650a144b.observability.pingcap.com",
	})
	if err != nil {
		panic(err)
	}
	go func() {
		err = mgr.Start(context.Background())
		if err != nil {
			panic(err)
		}
	}()

	time.Sleep(time.Second * 5)

	clientGroup.Client = mgr.GetClient()
	return clientGroup
}
