package dataplane

import (
	"context"

	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
	"sigs.k8s.io/controller-runtime/pkg/client"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
	compatcst "github.com/tidbcloud/infra-provider/pkg/compat/consts"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
)

const (
	gkeExecConfigAPIVersion = "client.authentication.k8s.io/v1beta1"
)

type gkeTenantClientMngr struct {
	network cloudv1.Network
	option  client.Options
}

func NewGKEClientManagerCompat(cli client.Client, network cloudv1.Network, opt client.Options) k8s.ClientManager {
	_, ok := network.Annotations[compatcst.CompatFlagAnnotation]
	if !ok {
		// If the network is not a compat network, use the original network manager.
		return k8s.NewGKEClientManager(cli, opt)
	}
	return NewGKEClientManager(network, opt)
}

func NewGKEClientManager(network cloudv1.Network, opt client.Options) k8s.ClientManager {
	return &gkeTenantClientMngr{
		network: network,
		option:  opt,
	}
}

func (t *gkeTenantClientMngr) 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 *gkeTenantClientMngr) GetConfig(ctx context.Context, gkeKey client.ObjectKey) (*rest.Config, error) {
	gkename := gkeKey.Name
	cfg := clientcmdapi.NewConfig()

	cfgctx := clientcmdapi.NewContext()
	cfgctx.Cluster = gkename
	cfgctx.AuthInfo = gkename

	cluster := clientcmdapi.NewCluster()
	// TODO: get ca data from gcp
	cluster.InsecureSkipTLSVerify = true
	// cluster.CertificateAuthorityData = []byte(gke.Status.AtProvider.CertificateAuthorityData)
	gkeendpoint := t.network.Annotations[compatcst.CompatK8SEndpointAnnotation]
	cluster.Server = gkeendpoint

	auth := clientcmdapi.NewAuthInfo()
	auth.Exec = &clientcmdapi.ExecConfig{
		APIVersion:      gkeExecConfigAPIVersion,
		InteractiveMode: clientcmdapi.NeverExecInteractiveMode,
		Command:         "gke-gcloud-auth-plugin",
		Args:            []string{"--use_application_default_credentials"},
	}

	cfg.Contexts[gkename] = cfgctx
	cfg.Clusters[gkename] = cluster
	cfg.AuthInfos[gkename] = auth
	cfg.CurrentContext = gkename

	return clientcmd.NewDefaultClientConfig(*cfg, nil).ClientConfig()
}

var _ k8s.ClientManager = &gkeTenantClientMngr{}
