package k8s

import (
	"context"

	"helm.sh/helm/v3/pkg/action"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type CacheClientGetter struct {
	getter ClientGetter

	cli  client.Client
	conf *action.Configuration
}

// NewCacheClientGetter creates a new ClientGetter that caches the client and helm config.
// To void the underlay getter build the client every time.
func NewCacheClientGetter(getter ClientGetter) *CacheClientGetter {
	return &CacheClientGetter{
		getter: getter,
	}
}

// GetClient implements ClientGetter interface.
func (c *CacheClientGetter) GetClient(ctx context.Context) (client.Client, error) {
	if c.cli != nil {
		return c.cli, nil
	}

	cli, err := c.getter.GetClient(ctx)
	if err != nil {
		return nil, err
	}

	c.cli = cli
	return c.cli, nil
}

// GetHelmConfig implements ClientGetter interface.
func (c *CacheClientGetter) GetHelmConfig(ctx context.Context) (*action.Configuration, error) {
	if c.conf != nil {
		return c.conf, nil
	}

	conf, err := c.getter.GetHelmConfig(ctx)
	if err != nil {
		return nil, err
	}

	c.conf = conf
	return c.conf, nil
}
