package open

import (
	"github.com/tidbcloud/core-svc/idl/pbgen/proto/core"
	"github.com/tidbcloud/dataflow-service/app/models/domain"
	"github.com/tidbcloud/idl/pbgen/proto/openapi/dp"
	globalv1 "github.com/tidbcloud/tidb-management-service/api/spec/global/dedicated/v1"
)

func RestoreStatus2OpenAPIList(status domain.RestoreStatusEnum) dp.ListRestoreRespItem_StatusEnum {
	switch status {
	case domain.RestoreStatusEnumPending:
		return dp.ListRestoreRespItem_PENDING
	case domain.RestoreStatusEnumRunning:
		return dp.ListRestoreRespItem_RUNNING
	case domain.RestoreStatusEnumFailed:
		return dp.ListRestoreRespItem_FAILED
	case domain.RestoreStatusEnumSuccess:
		return dp.ListRestoreRespItem_SUCCESS
	default:
		return dp.ListRestoreRespItem_RESTORE_STATUS_UNSPECIFIED
	}
}

func RestoreStatus2OpenAPIGet(status domain.RestoreStatusEnum) dp.GetRestoreResp_StatusEnum {
	switch status {
	case domain.RestoreStatusEnumPending:
		return dp.GetRestoreResp_PENDING
	case domain.RestoreStatusEnumRunning:
		return dp.GetRestoreResp_RUNNING
	case domain.RestoreStatusEnumFailed:
		return dp.GetRestoreResp_FAILED
	case domain.RestoreStatusEnumSuccess:
		return dp.GetRestoreResp_SUCCESS
	case domain.RestoreStatusEnumTerminated:
		return dp.GetRestoreResp_FAILED
	default:
		return dp.GetRestoreResp_RESTORE_STATUS_UNSPECIFIED
	}
}

func ClusterStatus2OpenAPIList(status core.ClusterStatus) string {
	switch status {
	case core.ClusterStatus_CLUSTER_STATUS_INITIALIZING:
		return "INITIALIZING"
	case core.ClusterStatus_CLUSTER_STATUS_PREPARING:
		return "PREPARING"
	case core.ClusterStatus_CLUSTER_STATUS_VOLUME_SNAPSHOT_RESTORING:
		return "VOLUME_SNAPSHOT_RESTORING"
	case core.ClusterStatus_CLUSTER_STATUS_LAUNCHING:
		return "LAUNCHING"
	case core.ClusterStatus_CLUSTER_STATUS_NORMAL:
		return "NORMAL"
	case core.ClusterStatus_CLUSTER_STATUS_HIBERNATED:
		return "HIBERNATED"
	case core.ClusterStatus_CLUSTER_STATUS_PAUSING:
		return "PAUSING"
	case core.ClusterStatus_CLUSTER_STATUS_PAUSED:
		return "PAUSED"
	case core.ClusterStatus_CLUSTER_STATUS_RESUMING:
		return "RESUMING"
	case core.ClusterStatus_CLUSTER_STATUS_SCALING:
		return "SCALING"
	case core.ClusterStatus_CLUSTER_STATUS_DELETED:
		return "DELETED"
	case core.ClusterStatus_CLUSTER_STATUS_DELETECOMPLETE:
		return "DELETECOMPLETE"
	case core.ClusterStatus_CLUSTER_STATUS_CLEARED:
		return "CLEARED"
	default:
		return "UNSPECIFIED"
	}
}

// DedicatedClusterState2OpenAPIList converts a dedicated cluster state (from mgmt.Cluster)
// to the Open API status string used in list/get restore responses.
// This is the mgmt.Cluster equivalent of ClusterStatus2OpenAPIList.
func DedicatedClusterState2OpenAPIList(state globalv1.Cluster_State) string {
	switch state {
	case globalv1.Cluster_CREATING:
		return "INITIALIZING"
	case globalv1.Cluster_AVAILABLE:
		return "NORMAL"
	case globalv1.Cluster_MODIFYING, globalv1.Cluster_SCALING:
		return "SCALING"
	case globalv1.Cluster_PAUSING:
		return "PAUSING"
	case globalv1.Cluster_PAUSED:
		return "PAUSED"
	case globalv1.Cluster_RESUMING:
		return "RESUMING"
	case globalv1.Cluster_UNAVAILABLE:
		return "UNAVAILABLE"
	case globalv1.Cluster_DELETED:
		return "DELETED"
	default:
		return "UNSPECIFIED"
	}
}
