void InteractionProcessor::run()
{
    std::stack<Interaction> undoStack;
    std::stack<Interaction> redoStack;
    
    view.refresh();

    while (true)
    {
        Interaction interaction = interactionReader.nextInteraction();

        if (interaction.type() == InteractionType::quit)
        {
            break;
        }
        else if (interaction.type() == InteractionType::undo)
        {
            
            if (!undoStack.empty())
            {
            

                Interaction undoInteraction = undoStack.top();
                Command* command = undoInteraction.command();
                try
                {
                    undoStack.pop();
                    redoStack.push(undoInteraction);
                    command->undo(model);
                    model.clearErrorMessage();
                }
                catch(EditorException& e)
                {

                    model.setErrorMessage(e.getReason());
                    delete command;
                }
                view.refresh();             
                
            }
        
        
        }
        else if (interaction.type() == InteractionType::redo)
        {
            if(!redoStack.empty())
            {
                Interaction redoInteraction = redoStack.top();
                Command* command = redoInteraction.command();
                try
                {

                    
                    redoStack.pop();
                    undoStack.push(redoInteraction);
                    command->execute(model);
                    model.clearErrorMessage();
                }

                
                catch(EditorException& e)
                {
                    model.setErrorMessage(e.getReason());
                    delete command;
                }
                view.refresh();
            }
        }
        else if (interaction.type() == InteractionType::command)
        {
            Command* command = interaction.command();

            try
            {
                command->execute(model);
                undoStack.push(interaction);
                model.clearErrorMessage();
            }
            catch (EditorException& e)
            {

                model.setErrorMessage(e.getReason());
                delete command;
            }

            view.refresh();

            // Note that you'll want to be more careful about when you delete
            // commands once you implement undo and redo.  For now, since
            // neither is implemented, I've just deleted it immediately
            // after executing it.  You'll need to wait to delete it until
            // you don't need it anymore.
            //delete command;
        }
    }

    while(!undoStack.empty())
    {
        Interaction undoInteraction = undoStack.top();
        delete undoInteraction.command();
        undoStack.pop();
    }
    while(!redoStack.empty())
    {
        Interaction redoInteraction = redoStack.top();
        delete redoInteraction.command();
        redoStack.pop();
    }
}
void InteractionProcessor::run()
{
    view.refresh();
    std::vector<Command*> undo;
    std::vector<Command*> redo;

    while (true)
    {
        Interaction interaction = interactionReader.nextInteraction();

        Command* command = interaction.command();
        Command* undoCommand = nullptr;
        Command* redoCommand = nullptr;

        if (interaction.type() == InteractionType::quit)
        {

            for (auto i = undo.begin(); i < undo.end(); i++)
            {
                delete *i;
            }

            for (auto j = redo.begin(); j < redo.end(); j++)
            {
                delete *j;
            }

            delete undoCommand;
            delete redoCommand;
            delete command;

            break;
        }
        else if (interaction.type() == InteractionType::undo)
        {

            if (undo.size() > 0)
            {

                undoCommand = undo.back();

                try
                {
                    undoCommand->undo(model);
                }
                catch (EditorException& e)
                {
                    model.setErrorMessage(e.getReason());
                }

                redo.push_back(undoCommand);
                undo.pop_back();

            }

            view.refresh();
        }
        else if (interaction.type() == InteractionType::redo)
        {
            if (redo.size() > 0)
            {

                redoCommand = redo.back();

                try
                {
                    redoCommand->execute(model);
                }
                catch (EditorException& e)
                {
                    model.setErrorMessage(e.getReason());
                }
                undo.push_back(redoCommand);
                redo.pop_back();

            }

            view.refresh();
        }
        else if (interaction.type() == InteractionType::command)
        {
            // Command* command = interaction.command();

            undo.push_back(command);

            try
            {
                command->execute(model);
                model.clearErrorMessage();
            }
            catch (EditorException& e)
            {
                model.setErrorMessage(e.getReason());
            }

            view.refresh();

            // Note that you'll want to be more careful about when you delete
            // commands once you implement undo and redo.  For now, since
            // neither is implemented, I've just deleted it immediately
            // after executing it.  You'll need to wait to delete it until
            // you don't need it anymore.
        }
    }

}