package utils

import (
	"github.com/go-logr/logr"

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

func TransInstanceTypeScalePhase(logger logr.Logger, cluster *cloudv1.Cluster,
	componentType cloudv1.ComponentType, newPhase cloudv1.InstanceTypeScalePhase) {
	checkAndLog := func(oldPhase cloudv1.InstanceTypeScalePhase, newPhase cloudv1.InstanceTypeScalePhase) bool {
		if oldPhase == newPhase {
			return false // no need to transfer
		}
		if (oldPhase == "" && newPhase == cloudv1.InstanceTypeScalePhaseCreatingNodes) ||
			(oldPhase == cloudv1.InstanceTypeScalePhaseCreatingNodes && newPhase == cloudv1.InstanceTypeScalePhaseCordoningNodes) ||
			(oldPhase == cloudv1.InstanceTypeScalePhaseCordoningNodes && newPhase == cloudv1.InstanceTypeScalePhaseRestartingPods) ||
			(oldPhase == cloudv1.InstanceTypeScalePhaseRestartingPods && newPhase == cloudv1.InstanceTypeScalePhaseDeletingNodes) ||
			(oldPhase == cloudv1.InstanceTypeScalePhaseDeletingNodes && newPhase == cloudv1.InstanceTypeScalePhaseNone) { // scale finished
			logger.Info("Transfer instance type scale phase", "from", oldPhase, "to", newPhase, "component", componentType)
			return true
		}
		logger.Error(nil, "Invalid instance type scale phase transfer", "from", oldPhase, "to", newPhase, "component", componentType)
		return false
	}

	if cluster.Status.DB == nil {
		cluster.Status.DB = &cloudv1.DBStatus{
			SecondaryStatus: cloudv1.DBSecondaryStatusUnhealthy,
		}
	}

	switch componentType {
	case cloudv1.ComponentPD:
		if cluster.Status.DB.PD == nil {
			cluster.Status.DB.PD = &cloudv1.PDStatus{}
		}
		if checkAndLog(cluster.Status.DB.PD.InstanceTypeScalePhase, newPhase) {
			cluster.Status.DB.PD.InstanceTypeScalePhase = newPhase
		}
	case cloudv1.ComponentTiDB:
		if cluster.Status.DB.TiDB == nil {
			cluster.Status.DB.TiDB = &cloudv1.TiDBStatus{}
		}
		if checkAndLog(cluster.Status.DB.TiDB.InstanceTypeScalePhase, newPhase) {
			cluster.Status.DB.TiDB.InstanceTypeScalePhase = newPhase
		}
	case cloudv1.ComponentTiKV:
		if cluster.Status.DB.TiKV == nil {
			cluster.Status.DB.TiKV = &cloudv1.TiKVStatus{}
		}
		if checkAndLog(cluster.Status.DB.TiKV.InstanceTypeScalePhase, newPhase) {
			cluster.Status.DB.TiKV.InstanceTypeScalePhase = newPhase
		}
	case cloudv1.ComponentTiProxy:
		if cluster.Status.DB.TiProxy == nil {
			cluster.Status.DB.TiProxy = &cloudv1.TiProxyStatus{}
		}
		if checkAndLog(cluster.Status.DB.TiProxy.InstanceTypeScalePhase, newPhase) {
			cluster.Status.DB.TiProxy.InstanceTypeScalePhase = newPhase
		}
	case cloudv1.ComponentTiFlash:
		if cluster.Status.DB.TiFlash == nil {
			cluster.Status.DB.TiFlash = &cloudv1.TiFlashStatus{}
		}
		if checkAndLog(cluster.Status.DB.TiFlash.InstanceTypeScalePhase, newPhase) {
			cluster.Status.DB.TiFlash.InstanceTypeScalePhase = newPhase
		}
	}
}
