package manager

import (
	"fmt"

	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/runtime"
	utilruntime "k8s.io/apimachinery/pkg/util/runtime"
	"k8s.io/client-go/tools/clientcmd"
	ctrl "sigs.k8s.io/controller-runtime"
	"sigs.k8s.io/controller-runtime/pkg/cache"
	"sigs.k8s.io/controller-runtime/pkg/manager"
	metricsserver "sigs.k8s.io/controller-runtime/pkg/metrics/server"
)

type LocalElectionManager struct {
	manager.Manager
}

func NewLocalElectionManager() *LocalElectionManager {
	scheme := runtime.NewScheme()
	utilruntime.Must(corev1.AddToScheme(scheme))
	restConfig, err := clientcmd.BuildConfigFromFlags("", "")
	if err != nil {
		panic(fmt.Errorf("failed to load in-cluster kubeconfig: %w", err))
	}
	mgr, err := ctrl.NewManager(restConfig, ctrl.Options{
		Scheme:  scheme,
		Metrics: metricsserver.Options{BindAddress: "0"}, // disable

		LeaderElection:          true,
		LeaderElectionID:        leaderElectionID,
		LeaderElectionNamespace: leaderElectionNamespace,

		LeaseDuration: &leaseDuration,
		RenewDeadline: &renewDeadline,
		Cache: cache.Options{
			SyncPeriod: NoSyncPeriod,
		},
	})
	if err != nil {
		panic(fmt.Errorf("failed to create in-cluster manager: %w", err))
	}

	return &LocalElectionManager{Manager: mgr}
}
