package cloud

import (
	"context"
	"encoding/base64"

	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"
	"k8s.io/apimachinery/pkg/types"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"sigs.k8s.io/controller-runtime/pkg/client"
)

type aliCloud struct {
	appbox *regionalpb.DataPlane
	region string

	ticdcServiceCfg *config.Config
}

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

func (a *aliCloud) BuildVolumeAttributesClass(name types.NamespacedName, class *VolumeAttributes) (client.Object, error) {
	/*res := &storagev1beta1.VolumeAttributesClass{
		ObjectMeta: metav1.ObjectMeta{
			Name: name.Name,
		},
		DriverName: "diskplugin.csi.alibabacloud.com",
		Parameters: map[string]string{
			// the provisioned read/write IOPS of the disk. This parameter is supported only by ESSD AutoPL disks.
			// Valid values: 0 to min{50000, 1000 × Capacity - Baseline IOPS},
			// where Baseline IOPS = min{1800 + 50 × Capacity, 50000}
			// Baseline is large enough for ticdc sorter
			"provisionedIops": "0",
		},
	}
	return res, nil*/
	return nil, nil
}

func (a *aliCloud) 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 *aliCloud) 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()
}
