@startuml
!include style.puml

box Logic LOGIC_COLOR_T1
participant ":LogicManager" as LogicManager LOGIC_COLOR
participant ":MooLahParser" as MooLahParser LOGIC_COLOR
participant "u:UndoCommand" as UndoCommand LOGIC_COLOR
end box

box Model MODEL_COLOR_T1
participant "model:Model" as Model MODEL_COLOR
participant ":ModelHistory" as ModelHistory MODEL_COLOR
end box

[-> LogicManager : execute("undo")
activate LogicManager

LogicManager -> MooLahParser : parseCommand("undo")
activate MooLahParser

create UndoCommand
MooLahParser -> UndoCommand
activate UndoCommand

UndoCommand --> MooLahParser
deactivate UndoCommand

MooLahParser --> LogicManager : u
deactivate MooLahParser

LogicManager -> UndoCommand : run(model)
activate UndoCommand

UndoCommand -> UndoCommand : validate(model)
activate UndoCommand

UndoCommand -> Model : canRollback()
activate Model

Model -> ModelHistory : isPastChangesEmpty()
activate ModelHistory

ModelHistory --> Model :
deactivate ModelHistory

Model --> UndoCommand
deactivate Model

UndoCommand --> UndoCommand
deactivate UndoCommand

UndoCommand -> UndoCommand :execute(model)
activate UndoCommand

UndoCommand -> Model : rollback()
activate Model

Model -> ModelHistory : getPrevChanges()
activate ModelHistory

ModelHistory --> Model : prevChanges
deactivate ModelHistory

Model -> Model : applyChanges(prevChanges)
activate Model

Model --> Model
deactivate Model

Model --> UndoCommand
deactivate Model

UndoCommand --> UndoCommand
deactivate UndoCommand

UndoCommand --> LogicManager : result
deactivate UndoCommand
UndoCommand -[hidden]-> LogicManager : result
destroy UndoCommand

[<--LogicManager
deactivate LogicManager
@enduml
