package cloud

import (
	"context"
	"encoding/base64"
	"fmt"

	regionalpb "github.com/tidbcloud/cluster-service-ng/api/tidbcloud/dataplane-manager/v1"
	"github.com/tidbcloud/ticdc-service-ng/pkg/config"
	"github.com/tidbcloud/ticdc-service-ng/pkg/scheme"
	storagev1beta1 "k8s.io/api/storage/v1beta1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type aws struct {
	appbox *regionalpb.DataPlane
	region string

	ticdcServiceCfg *config.Config
}

func NewAWSProvider(
	appbox *regionalpb.DataPlane,
	ticdcServiceCfg *config.Config,
) Provider {
	return &aws{
		appbox:          appbox,
		ticdcServiceCfg: ticdcServiceCfg,
		region:          ticdcServiceCfg.Region,
	}
}

func (a *aws) BuildVolumeAttributesClass(name types.NamespacedName, class *VolumeAttributes) (client.Object, error) {
	params := map[string]string{
		"type": "gp3",
	}
	params["iops"] = fmt.Sprint(class.Iops)
	params["throughput"] = fmt.Sprint(class.ThroughputMbs)
	res := &storagev1beta1.VolumeAttributesClass{
		ObjectMeta: metav1.ObjectMeta{
			Name: name.Name,
		},
		DriverName: "ebs.csi.aws.com",
		Parameters: params,
	}
	return res, nil
}

func (a *aws) GetKubeClient(ctx context.Context) (client.Client, error) {
	opts := client.Options{
		Scheme: scheme.Scheme,
	}
	restCfg, err := a.getConfig()
	if err != nil {
		return nil, err
	}
	return client.New(restCfg, opts)
}

func (a *aws) getConfig() (*rest.Config, error) {
	if a.ticdcServiceCfg.Debug.Enable && a.ticdcServiceCfg.Debug.DataPlaneKubeConfig != "" {
		return clientcmd.BuildConfigFromFlags("", a.ticdcServiceCfg.Debug.DataPlaneKubeConfig)
	}
	data, err := base64.StdEncoding.DecodeString(a.appbox.Kubernetes.Kubeconfig)
	if err != nil {
		return nil, err
	}
	kubcfg, err := clientcmd.Load(data)
	if err != nil {
		return nil, err
	}
	return clientcmd.NewDefaultClientConfig(*kubcfg, nil).ClientConfig()
}
