// Package aks add by blacknc <blacknc@163.com> at 2024/08/28 23:50:01
package aks

import (
	"context"

	corev1 "k8s.io/api/core/v1"
	storagev1 "k8s.io/api/storage/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/utils/ptr"

	"github.com/tidbcloud/eks-provider/controllers/imports/task"
	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
)

type StorageClass struct {
	*task.BaseTask
	storageClass string
}

// NewStorageClass creates customized storage classes with parameters specified from infra-api.
func NewStorageClass(ctx *task.Context, storageClass string) *StorageClass {
	return &StorageClass{
		BaseTask:     &task.BaseTask{Context: ctx},
		storageClass: storageClass,
	}
}

func (t *StorageClass) Name() string {
	return "StorageClass"
}

func (t *StorageClass) Create(ctx context.Context) deploy.Result {

	if t.Import.Spec.StorageRequest == "" {
		return deploy.Done()
	}

	clusterCli := t.EnvProvider.GetClient()
	sc := t.describeStorageClass()

	t.Logger.Info("try to create storageclass in dataplane aks", "sc", sc.Name)
	if err := k8s.CreateIfNotExist(ctx, clusterCli, sc); err != nil {
		return deploy.Error(err)
	}

	return deploy.Done()
}

func (t *StorageClass) describeStorageClass() *storagev1.StorageClass {
	sc := &storagev1.StorageClass{
		ObjectMeta: metav1.ObjectMeta{
			Name: t.storageClass,
		},
		VolumeBindingMode:    ptr.To(storagev1.VolumeBindingWaitForFirstConsumer),
		AllowVolumeExpansion: ptr.To(true),
		ReclaimPolicy:        ptr.To(corev1.PersistentVolumeReclaimDelete),
		Parameters: map[string]string{
			"csi.storage.k8s.io/fstype": "ext4",
			"DiskIOPSReadWrite":         "16000",
			"DiskMBpsReadWrite":         "1000",
			"skuName":                   "PremiumV2_LRS",
		},
		MountOptions: []string{"nodelalloc,noatime"},
		Provisioner:  "disk.csi.azure.com",
	}
	return sc
}
