package util

import (
	"fmt"

	apiv1 "github.com/tidbcloud/infra-provider/api/tidbcloud/cluster-server/v1"
)

const (
	StorageTypeGp2               = "gp2"
	StorageTypeGp3               = "gp3"
	StorageTypeIo1               = "io1"
	StorageTypeIo2               = "io2"
	StorageTypeLocalStorage      = "local-storage"
	StorageTypePDSSD             = "pd-ssd"
	StorageTypeHyperdiskBalanced = "hyperdisk-balanced"
	// Azure
	StorageTypeAzurePremiumV2 = "premiumv2"
	StorageTypeAzureUltraSSD  = "ultrassd"
)

// BuildStorageClassName builds the storageclass name based on the component and storage spec,
// which follows the name convention: {clusterComponent}-{volumeType}-{iops}-{throughput}, eg. "tikv-gp3-3000-144".
// Refer to: https://github.com/tidbcloud/core-svc/blob/1296c92fdca6e17106f56f367abc120a21dd035b/svc/core_ctx/domain/constant/fn.go#L27
func BuildStorageClassName(component string, storage *apiv1.Cluster_Storage) (string, error) {
	if component == "" || storage == nil {
		return "", fmt.Errorf("component and storage must not be empty")
	}

	switch t := storage.GetType(); t {
	case StorageTypeGp2, StorageTypePDSSD:
		return fmt.Sprintf("%s-%s", component, t), nil
	case StorageTypeGp3, StorageTypeIo1, StorageTypeIo2, StorageTypeAzurePremiumV2, StorageTypeAzureUltraSSD, StorageTypeHyperdiskBalanced:
		return fmt.Sprintf("%s-%s-%d-%d", component, t, storage.GetIops(), storage.GetThroughputMbs()), nil
	case StorageTypeLocalStorage:
		return t, nil
	case "":
		return "", fmt.Errorf("storage type must not be empty")
	default:
		return "", fmt.Errorf("unsupported storage type: %s", t)
	}
}
