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 replayStatusMatrix = map[string]map[string]string{
	string(entity.ReplayCurrentStatePending): {
		string(entity.ReplayActionDeploy):   string(entity.ReplayCurrentStateDeploying),
		string(entity.ReplayActionActivate): string(entity.ReplayCurrentStateDeploying),
		string(entity.ReplayActionDelete):   string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStateDeploying): {
		string(entity.ReplayActionDelete): string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStateDeployed): {
		string(entity.ReplayActionActivate): string(entity.ReplayCurrentStateStarting),
		string(entity.ReplayActionDelete):   string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStateStarting): {
		string(entity.ReplayActionPause):  string(entity.ReplayCurrentStatePausing),
		string(entity.ReplayActionDelete): string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStateRunning): {
		string(entity.ReplayActionPause):  string(entity.ReplayCurrentStatePausing),
		string(entity.ReplayActionDelete): string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStatePausing): {
		string(entity.ReplayActionActivate): string(entity.ReplayCurrentStateStarting),
		string(entity.ReplayActionDelete):   string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStatePaused): {
		string(entity.ReplayActionActivate): string(entity.ReplayCurrentStateStarting),
		string(entity.ReplayActionDelete):   string(entity.ReplayCurrentStateDeleting),
	},
	string(entity.ReplayCurrentStateDeleting): {},
	string(entity.ReplayCurrentStateDeleted):  {},
}

var replayFriendlyActionMap = map[string]map[string]status_matrix.ActionStrategy{
	string(entity.ReplayActionDeploy): {
		string(entity.ReplayActionDelete): status_matrix.Grab,
	},
	string(entity.ReplayActionActivate): {
		string(entity.ReplayActionPause):  status_matrix.Grab,
		string(entity.ReplayActionDelete): status_matrix.Grab,
	},
	string(entity.ReplayActionPause): {
		string(entity.ReplayActionDelete): status_matrix.Grab,
	},
	string(entity.ReplayActionDelete): {},
}

// steadyStateMatrix define the stable state that should be reached after the state transition
var replaySteadyStateMatrix = map[string]string{
	string(entity.ReplayCurrentStateDeploying): string(entity.ReplayCurrentStateDeployed),
	string(entity.ReplayCurrentStateStarting):  string(entity.ReplayCurrentStateRunning),
	string(entity.ReplayCurrentStatePausing):   string(entity.ReplayCurrentStatePaused),
	string(entity.ReplayCurrentStateDeleting):  string(entity.ReplayCurrentStateDeleted),
}

// NewReplayStatusMatrix create the Replay status machine instance
func NewReplayStatusMatrix() status_matrix.StatusMatrix {
	return statusMatrixImpl.NewStatusMatrix(
		replayStatusMatrix,
		replayFriendlyActionMap,
		replaySteadyStateMatrix,
	)
}
