package config

import (
	"fmt"

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

type Cluster struct {
	Kubeconfig string
	Context    string

	config *rest.Config
}

type Config struct {
	User Cluster
}

func (c *Config) LoadUserConfig() (*rest.Config, error) {
	if c.User.config != nil {
		return c.User.config, nil
	}
	cfg, err := loadKubeconfig(c.User.Kubeconfig, c.User.Context)
	if err != nil {
		return nil, err
	}
	c.User.config = cfg

	return c.User.config, nil
}

func loadKubeconfig(path, contextName string) (*rest.Config, error) {
	if path == "" {
		cfg, err := rest.InClusterConfig()
		if err == nil {
			return cfg, nil
		}
	}

	cfg, err := clientcmd.NewNonInteractiveDeferredLoadingClientConfig(
		&clientcmd.ClientConfigLoadingRules{ExplicitPath: path},
		&clientcmd.ConfigOverrides{
			CurrentContext: contextName,
		}).
		ClientConfig()
	if err != nil {
		return nil, fmt.Errorf("failed to load kube config: %w", err)
	}

	return cfg, nil
}
