package k8s

import (
	"fmt"
	"os"
	"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.Interface

func MustCreateKubernetesClient() kubernetes.Interface {
	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.Interface {
	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 = filepath.Join(home, ".kube", "config")
	} else {
		kubeconfig = ""
	}
	if value := os.Getenv("KUBECONFIG"); value != "" {
		kubeconfig = value
	}

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