package ack

import (
	"context"

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

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

type StorageClass struct {
	*task.BaseTask
	storageClass string
}

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 {
	clusterCli := t.Remote
	sc := t.describeStorageClass()

	t.Logger.Info("try to create storageclass in dataplane ack", "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,
		},
		Provisioner: "diskplugin.csi.alibabacloud.com",
		Parameters: map[string]string{
			"fstype":          "ext4",
			"type":            "cloud_auto",
			"encrypted":       "true",
			"burstingEnabled": "true",
		},
		MountOptions:         []string{"nodelalloc", "noatime"},
		AllowVolumeExpansion: util.Pointer(true),
		ReclaimPolicy:        util.Pointer(corev1.PersistentVolumeReclaimDelete),
		VolumeBindingMode:    util.Pointer(storagev1.VolumeBindingWaitForFirstConsumer),
	}
	return sc
}
