package k8s

import (
	"flag"
	"fmt"
	"path/filepath"
	"sync"

	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"k8s.io/client-go/util/homedir"
)

var syncOnce = sync.Once{}
var clientset *kubernetes.Clientset

func MustCreateKubernetesClient() *kubernetes.Clientset {
	config, err := getK8sConfig()

	if err != nil {
		panic(fmt.Errorf("failed to create Kubernetes config: %v", err))
	}

	cs, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(fmt.Errorf("failed to create Kubernetes client: %v", err))
	}

	return cs
}

func SingleKubernetesClient() *kubernetes.Clientset {
	syncOnce.Do(func() {
		clientset = MustCreateKubernetesClient()
	})

	return clientset
}
func getK8sConfig() (*rest.Config, error) {
	if config, err := rest.InClusterConfig(); err != nil {
		return outsideConfig()
	} else {
		return config, err
	}
}

func outsideConfig() (*rest.Config, error) {
	var kubeconfig *string
	if home := homedir.HomeDir(); home != "" {
		kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
	} else {
		kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
	}
	flag.Parse()

	// use the current context in kubeconfig
	return clientcmd.BuildConfigFromFlags("", *kubeconfig)
}
