package deps

import (
	k8sutil "github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/infra-provider/pkg/scheme"
	"k8s.io/client-go/dynamic"
	"k8s.io/client-go/kubernetes"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type Denpendency struct {
	// infra clients
	InfraClient        kubernetes.Interface
	InfraDynamicClient dynamic.Interface // TODO: remove it and use `dynamic.New()` to create a dynamic client from kubernetes.Interface.
	InfraCtrlClient    client.Client

	// gardener clients
	GardenerClient        kubernetes.Interface
	GardenerDynamicClient dynamic.Interface // TODO: remove it and use `dynamic.New()` to create a dynamic client from kubernetes.Interface.
	GardenerCtrlClient    client.Client
}

func New() *Denpendency {
	return &Denpendency{}
}

func (d *Denpendency) CreateClientsForInfra(path string) error {
	kcfg, err := k8sutil.GetKubeConfig(path)
	if err != nil {
		return err
	}

	d.InfraClient, err = kubernetes.NewForConfig(kcfg)
	if err != nil {
		return err
	}
	d.InfraDynamicClient, err = dynamic.NewForConfig(kcfg)
	if err != nil {
		return err
	}
	d.InfraCtrlClient, err = client.New(kcfg, client.Options{Scheme: scheme.Scheme})
	if err != nil {
		return err
	}
	return nil
}

func (d *Denpendency) CreateClientsForGardener(path string) error {
	kcfg, err := k8sutil.GetKubeConfig(path)
	if err != nil {
		return err
	}

	d.GardenerClient, err = kubernetes.NewForConfig(kcfg)
	if err != nil {
		return err
	}
	d.GardenerDynamicClient, err = dynamic.NewForConfig(kcfg)
	if err != nil {
		return err
	}
	d.GardenerCtrlClient, err = client.New(kcfg, client.Options{Scheme: scheme.Scheme})
	if err != nil {
		return err
	}
	return nil
}
