// Package common add by blacknc <blacknc@163.com> at 2024/08/28 17:17:20
package common

import (
	"context"

	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"
	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 PVC struct {
	*task.BaseTask
	storageClass string
}

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

func NewPVC(ctx *task.Context, storageClass string) *PVC {
	return &PVC{
		BaseTask:     &task.BaseTask{Context: ctx},
		storageClass: storageClass,
	}
}

func (t *PVC) Create(ctx context.Context) deploy.Result {
	if t.Import.Spec.StorageRequest == "" {
		return deploy.Done()
	}

	pvc := t.describePVC()
	clusterCli := t.EnvProvider.GetClient()
	err := k8s.CreateIfNotExist(ctx, clusterCli, pvc)
	if err != nil {
		return deploy.Error(err)
	}

	return deploy.Done()
}

func (t *PVC) Delete(ctx context.Context) deploy.Result {
	if !t.IsClusterExist() {
		return deploy.Done()
	}
	pvc := &corev1.PersistentVolumeClaim{
		ObjectMeta: metav1.ObjectMeta{
			Name:      t.Import.Name,
			Namespace: t.GetClusterNameSpace(),
		},
	}
	clusterCli := t.EnvProvider.GetClient()
	return deploy.ErrorOrDone(k8s.DeleteObject(ctx, clusterCli, pvc))
}

func (t *PVC) describePVC() *corev1.PersistentVolumeClaim {
	v := resource.MustParse(t.Import.Spec.StorageRequest)
	ns := t.GetClusterNameSpace()
	name := t.Import.Name
	return &corev1.PersistentVolumeClaim{
		ObjectMeta: metav1.ObjectMeta{
			Name:      name,
			Namespace: ns,
			Labels:    t.LightningLabels,
		},
		Spec: corev1.PersistentVolumeClaimSpec{
			AccessModes: []corev1.PersistentVolumeAccessMode{
				corev1.ReadWriteOnce,
			},
			StorageClassName: ptr.To(t.storageClass),
			Resources: corev1.VolumeResourceRequirements{
				Requests: corev1.ResourceList{
					corev1.ResourceStorage: v,
				},
			},
		},
	}
}
