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

type azure struct {
	appbox          *regionalpb.DataPlane
	ticdcServiceCfg *config.Config
}

func NewAzureProvider(
	appbox *regionalpb.DataPlane,
	ticdcServiceCfg *config.Config,
) Provider {
	return &azure{
		appbox:          appbox,
		ticdcServiceCfg: ticdcServiceCfg,
	}
}

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

func (p *azure) getConfig() (*rest.Config, error) {
	if p.ticdcServiceCfg.Debug.Enable && p.ticdcServiceCfg.Debug.DataPlaneKubeConfig != "" {
		return clientcmd.BuildConfigFromFlags("", p.ticdcServiceCfg.Debug.DataPlaneKubeConfig)
	}
	data, err := base64.StdEncoding.DecodeString(p.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()
}

func (p *azure) BuildVolumeAttributesClass(name types.NamespacedName, class *VolumeAttributes) (client.Object, error) {
	params := map[string]interface{}{
		"skuName":           "PremiumV2_LRS",
		"DiskIOPSReadWrite": fmt.Sprintf("%d", class.Iops),
		"DiskMBpsReadWrite": fmt.Sprintf("%d", class.ThroughputMbs),
	}
	obj := &unstructured.Unstructured{
		Object: map[string]interface{}{
			"apiVersion": "storage.k8s.io/v1",
			"kind":       "VolumeAttributesClass",
			"metadata": map[string]interface{}{
				"name": name.Name,
			},
			"driverName": "disk.csi.azure.com",
			"parameters": params,
		},
	}
	return obj, nil
}
