package task

import (
	"context"

	"github.com/tidbcloud/infra-provider/pkg/deploy"
	"github.com/tidbcloud/infra-provider/pkg/k8s"
	"github.com/tidbcloud/ticdc-service/pkg/cloud"
	"k8s.io/apimachinery/pkg/types"
)

type storageClass struct {
	*baseTask
}

func NewStorageClassTask(ctx *Context) deploy.Task {
	return &storageClass{
		baseTask: &baseTask{Context: ctx},
	}
}

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

func (t *storageClass) Create(ctx context.Context) deploy.Result {
	scType := t.Cdc.Spec.Storage.Type
	scIops := t.Cdc.Spec.Storage.Iops
	scThroughput := t.Cdc.Spec.Storage.ThroughputMbs
	name := types.NamespacedName{
		Name:      t.getStorageClassName(),
		Namespace: t.Cdc.Namespace,
	}
	storageclass := cloud.StorageClass{
		Type:          scType,
		Iops:          scIops,
		ThroughputMbs: scThroughput,
	}
	sc, err := t.CloudProvider.BuildStorageClass(name, &storageclass)
	if err != nil {
		return deploy.Error(err)
	}
	err = k8s.Apply(ctx, t.Remote, sc)
	return deploy.PanicOrDone(err)
}

// storageclass is shared by all cdc cluster in the same dataplane k8s cluster
// So we should not delete them when a single cdc cluster is deleted
func (t *storageClass) Delete(ctx context.Context) deploy.Result {
	return deploy.Done()
}
