package models

import (
	log "github.com/sirupsen/logrus"
	dedicatedv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
	v1beta1 "github.com/tidbcloud/tidb-management-service/api/spec/tidb_cloud_open_api/common/v1beta1"
)

const MeteredStorageKey = "data"

var ExcludeClusterStates = []v1beta1.ClusterState{
	v1beta1.ClusterState_DELETING,
	v1beta1.ClusterState_CREATING,
	v1beta1.ClusterState_DELETED,
}

var MeteredClusterState = []dedicatedv1.Cluster_State{
	dedicatedv1.Cluster_AVAILABLE,
	dedicatedv1.Cluster_MODIFYING,
	dedicatedv1.Cluster_PAUSED,
	dedicatedv1.Cluster_RESUMING,
	dedicatedv1.Cluster_PAUSING,
	dedicatedv1.Cluster_SCALING,
}

// IfClusterStateNeedMetering only meter for cluster which state in MeteredClusterState
func IfClusterStateNeedMetering(state dedicatedv1.Cluster_State) bool {
	for _, metered := range MeteredClusterState {
		if metered == state {
			return true
		}
	}

	return false
}

// IfComponentTypeNeedMetering only meter for tidb/tikv/tiflash
func IfComponentTypeNeedMetering(componentType dedicatedv1.ComponentType) bool {
	return componentType == dedicatedv1.ComponentType_TIDB ||
		componentType == dedicatedv1.ComponentType_TIKV ||
		componentType == dedicatedv1.ComponentType_TIFLASH ||
		componentType == dedicatedv1.ComponentType_TIPROXY
}

func IfComponentTypeNeedMeteringForDisk(componentType dedicatedv1.ComponentType) bool {
	return componentType == dedicatedv1.ComponentType_TIKV ||
		componentType == dedicatedv1.ComponentType_TIFLASH
}

// IfNodeStateNeedMetering only meter for node state AVAILABLE/UNAVAILABLE/DELETING
func IfNodeStateNeedMetering(nodeState dedicatedv1.ComponentNodeInfo_Component_Node_State) bool {
	return nodeState == dedicatedv1.ComponentNodeInfo_Component_Node_AVAILABLE ||
		nodeState == dedicatedv1.ComponentNodeInfo_Component_Node_UNAVAILABLE ||
		nodeState == dedicatedv1.ComponentNodeInfo_Component_Node_DELETING
}

// IfClusterScaling if the cluster scaling
func IfClusterScaling(state dedicatedv1.Cluster_State) bool {
	return dedicatedv1.Cluster_SCALING == state ||
		dedicatedv1.Cluster_MODIFYING == state
}

// IfPauseOrResume only meter disk for those clusters
func IfPauseOrResume(state dedicatedv1.Cluster_State) bool {
	return state == dedicatedv1.Cluster_PAUSING ||
		state == dedicatedv1.Cluster_PAUSED ||
		state == dedicatedv1.Cluster_RESUMING
}

func mapVolumeType(volumeType string) string {
	switch volumeType {
	case "GP2":
		return "gp2"
	case "GP3":
		return "gp3"
	case "IO2":
		return "io2"
	case "PD_SSD":
		return "pd-ssd"
	case "PREMIUMV2":
		return "premiumv2"
	case "ULTRASSD":
		return "ultrassd"
	case "LOCAL_STORAGE":
		return "local-storage"
	}
	log.Errorf("unsupported volume type %s", volumeType)
	return "volume_type_unspecified"
}
