package impl

import (
	"github.com/tidbcloud/dataflow-service/app/internal/status_matrix"
	statusMatrixImpl "github.com/tidbcloud/dataflow-service/app/internal/status_matrix/impl"
	"github.com/tidbcloud/dataflow-service/app/repo/entity"
)

// current status -> action -> next status
var pitBackupSwitchStatusMatrix = map[string]map[string]string{
	string(entity.PitBackupStatusDisabled): {
		string(entity.PitBackupSwitchActionEnable): string(entity.PitBackupStatusWaitingForEnabling),
	},

	string(entity.PitBackupStatusWaitingForEnabling): {
		string(entity.PitBackupSwitchActionDisable):  string(entity.PitBackupStatusDisabled),
		string(entity.PitBackupSwitchActionDoEnable): string(entity.PitBackupStatusEnabling),
	},

	string(entity.PitBackupStatusEnabling): {},

	string(entity.PitBackupStatusEnabled): {
		string(entity.PitBackupSwitchActionDisable): string(entity.PitBackupStatusDisabling),
		string(entity.PitBackupSwitchActionRestart): string(entity.PitBackupStatusWaitingForRestarting),
	},

	string(entity.PitBackupStatusDisabling): {},

	string(entity.PitBackupStatusWaitingForRestarting): {
		string(entity.PitBackupSwitchActionCancelRestart): string(entity.PitBackupStatusEnabled),
		string(entity.PitBackupSwitchActionDoRestart):     string(entity.PitBackupStatusRestarting),
		string(entity.PitBackupSwitchActionDisable):       string(entity.PitBackupStatusDisabling),
	},

	string(entity.PitBackupStatusRestarting): {},
}

// action -> action -> strategy
var pitBackupSwitchFriendlyActionMap = map[string]map[string]status_matrix.ActionStrategy{
	// allow disable to be called when enabling
	string(entity.PitBackupSwitchActionEnable): {
		string(entity.PitBackupSwitchActionDisable):  status_matrix.Grab,
		string(entity.PitBackupSwitchActionDoEnable): status_matrix.Grab,
	},

	// allow call cancel restart  when need restart
	string(entity.PitBackupSwitchActionRestart): {
		string(entity.PitBackupSwitchActionCancelRestart): status_matrix.Grab,
		string(entity.PitBackupSwitchActionDoRestart):     status_matrix.Grab,
		string(entity.PitBackupSwitchActionDisable):       status_matrix.Grab,
	},
}

var pitBackupSwitchSteadyStateMatrix = map[string]string{
	string(entity.PitBackupStatusEnabling):   string(entity.PitBackupStatusEnabled),
	string(entity.PitBackupStatusDisabling):  string(entity.PitBackupStatusDisabled),
	string(entity.PitBackupStatusRestarting): string(entity.PitBackupStatusEnabled),
}

func NewPitBackupSwitchStatusMatrix() status_matrix.StatusMatrix {
	return statusMatrixImpl.NewStatusMatrix(
		pitBackupSwitchStatusMatrix,
		pitBackupSwitchFriendlyActionMap,
		pitBackupSwitchSteadyStateMatrix)
}
