package impl

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

// current status -> action -> next status
var statusMatrix = map[string]map[string]string{
	string(entity.TiCDCClusterStatusCreating): {
		string(entity.TiCDCClusterActionDelete): string(entity.TiCDCClusterStatusDeleting),
	},
	string(entity.TiCDCClusterStatusRunning): {
		string(entity.TiCDCClusterActionDelete): string(entity.TiCDCClusterStatusDeleting),
		string(entity.TiCDCClusterActionScale):  string(entity.TiCDCClusterStatusScaling),
	},
	string(entity.TiCDCClusterStatusScaling): {
		string(entity.TiCDCClusterActionDelete): string(entity.TiCDCClusterStatusDeleting),
	},
	string(entity.TiCDCClusterStatusDeleting): {},
	string(entity.TiCDCClusterStatusDeleted):  {},
}

var friendlyActionMap = map[string]map[string]status_matrix.ActionStrategy{
	string(entity.TiCDCClusterActionCreate): {
		string(entity.TiCDCClusterActionDelete): status_matrix.Grab,
	},
	string(entity.TiCDCClusterActionScale): {
		string(entity.TiCDCClusterActionDelete): status_matrix.Grab,
	},
	string(entity.TiCDCClusterActionDelete): {},
}

var steadyStateMatrix = map[string]string{
	string(entity.TiCDCClusterStatusCreating): string(entity.TiCDCClusterStatusRunning),
	string(entity.TiCDCClusterStatusDeleting): string(entity.TiCDCClusterStatusDeleted),
	string(entity.TiCDCClusterStatusScaling):  string(entity.TiCDCClusterStatusRunning),
}

func NewTicdcClusterStatusMatrix() status_matrix.StatusMatrix {
	return statusMatrixImpl.NewStatusMatrix(statusMatrix, friendlyActionMap, steadyStateMatrix)
}
