package k8s

import (
	"context"

	ackv1alpha1 "github.com/crossplane-contrib/provider-upjet-alibabacloud/apis/ack/v1alpha1"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type ackClientMgr struct {
	cli           client.Client
	option        client.Options
	assumeRoleARN string
}

func NewACKClientManager(cli client.Client, opt client.Options, assumeRoleARN string) ClientManager {
	return &ackClientMgr{
		cli:           cli,
		option:        opt,
		assumeRoleARN: assumeRoleARN,
	}
}

func (t *ackClientMgr) GetClient(ctx context.Context, cluster client.ObjectKey) (client.Client, error) {
	restCfg, err := t.GetConfig(ctx, cluster)
	if err != nil {
		return nil, err
	}
	cli, err := client.New(restCfg, t.option)
	if err != nil {
		return nil, err
	}
	return cli, nil
}

func (t *ackClientMgr) GetConfig(ctx context.Context, ackKey client.ObjectKey) (*rest.Config, error) {
	ack := &ackv1alpha1.ManagedKubernetes{}
	err := t.cli.Get(ctx, ackKey, ack)
	if err != nil {
		return nil, err
	}

	cfg, err := BuildACKKubeconfig(ack, t.assumeRoleARN)
	if err != nil {
		return nil, err
	}
	return clientcmd.NewDefaultClientConfig(*cfg, nil).ClientConfig()
}
