package infraapi

import (
	corev1 "k8s.io/api/core/v1"
	"k8s.io/apimachinery/pkg/api/resource"

	cloudv1 "github.com/tidbcloud/infra-api/api/v1"
)

func SetBackupDefaultEnv(backup *cloudv1.Backup) {
	for _, env := range backup.Spec.Env {
		if env.Name == GoMemLimitEnv {
			return
		}
	}
	// no GOMEMLIMIT in env, add it
	backup.Spec.Env = append(backup.Spec.Env, corev1.EnvVar{
		Name:  GoMemLimitEnv,
		Value: BackupDefaultGoMemLimit,
	})
}

func SetBackupDefaultResourceRequirements(backup *cloudv1.Backup) {
	if backup.Spec.ResourceRequirements == nil {
		backup.Spec.ResourceRequirements = &corev1.ResourceRequirements{}
	}
	if backup.Spec.ResourceRequirements.Limits == nil {
		backup.Spec.ResourceRequirements.Limits = make(corev1.ResourceList, 2)
	}
	// if no memory limits, add it
	if _, ok := backup.Spec.ResourceRequirements.Limits[corev1.ResourceMemory]; !ok {
		backup.Spec.ResourceRequirements.Limits[corev1.ResourceMemory] = resource.MustParse(BackupDefaultMemoryLimit)
	}

	if backup.Spec.ResourceRequirements.Requests == nil {
		backup.Spec.ResourceRequirements.Requests = make(corev1.ResourceList, 2)
	}
	// if no memory requests, add it
	if _, ok := backup.Spec.ResourceRequirements.Requests[corev1.ResourceMemory]; !ok {
		backup.Spec.ResourceRequirements.Requests[corev1.ResourceMemory] = resource.MustParse(BackupDefaultMemoryRequest)
	}
}

type BackupParam struct {
	TenantID    uint64
	ProjectID   uint64
	ClusterID   uint64
	BackupName  string
	CommitTS    *string
	Storage     *string
	CleanPolicy cloudv1.CleanPolicy

	// used for 3 layers backup
	InstanceType *string

	Env                  []corev1.EnvVar
	ResourceRequirements *corev1.ResourceRequirements

	NodeRole      *string
	Configuration *cloudv1.DPConfiguration

	TagEnvironmentValue string
	TagComponentValue   string
}

type CreateBackupParam struct {
	ClusterID uint64
	TenantID  uint64
	ProjectID uint64

	BackupName  string
	Storage     string
	CleanPolicy cloudv1.CleanPolicy
	CommitTS    string
	TableFilter []string

	IsVolumeBackup bool

	Env                  []corev1.EnvVar
	ResourceRequirements *corev1.ResourceRequirements
	InstanceType         *string

	NodeRole      *string
	Configuration *cloudv1.DPConfiguration

	TagComponentValue   string
	TagEnvironmentValue string
}
