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 statusMatrix = map[string]map[string]string{
	string(entity.BackupSettingStatusCreating): {
		string(entity.BackupSettingActionDelete): string(entity.BackupSettingStatusDeleted),
	},
	string(entity.BackupSettingStatusEditingRegion): {
		string(entity.BackupSettingActionDelete): string(entity.BackupSettingStatusDeleted),
	},
	string(entity.BackupSettingStatusNormal): {
		string(entity.BackupSettingActionDelete):       string(entity.BackupSettingStatusDeleted),
		string(entity.BackupSettingActionModifyRegion): string(entity.BackupSettingStatusEditingRegion),
		string(entity.BackupSettingActionModifyPitR):   string(entity.BackupSettingStatusEditingPitr),
	},
	string(entity.BackupSettingStatusEditingPitr): {
		string(entity.BackupSettingActionDelete): string(entity.BackupSettingStatusDeleted),
		// Turn off this when the user is editing the pitr, and if it can be turned off, immediately update the status
		string(entity.BackupSettingActionModifyPitR): string(entity.BackupSettingStatusNormal),
	},
	string(entity.BackupSettingStatusDeleted): {},
}

var friendlyActionMap = map[string]map[string]status_matrix.ActionStrategy{
	string(entity.BackupSettingActionCreate): {
		string(entity.BackupSettingActionDelete): status_matrix.Grab,
	},
	string(entity.BackupSettingActionDelete): {},
	string(entity.BackupSettingActionModifyRegion): {
		string(entity.BackupSettingActionDelete): status_matrix.Grab,
	},
	string(entity.BackupSettingActionModifyPitR): {
		string(entity.BackupSettingActionDelete):     status_matrix.Grab,
		string(entity.BackupSettingActionModifyPitR): status_matrix.Grab,
	},
}

var steadyStateMatrix = map[string]string{
	string(entity.BackupSettingStatusCreating):      string(entity.BackupSettingStatusNormal),
	string(entity.BackupSettingStatusEditingRegion): string(entity.BackupSettingStatusNormal),
	string(entity.BackupSettingStatusEditingPitr):   string(entity.BackupSettingStatusNormal),
}

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