// @topic S-0330-14-15-20 Java MVC JTable Demo
// @brief Use case controller

package gui_demo;

import java.util.ArrayList;

public class ControllerDemo {
    //----------------------------------------
    // data
    //----------------------------------------
    private WindowMainApp window = null;
    private boolean isSimulationRunning = false;
    private Scenario scenario = new Scenario();

    //----------------------------------------
    // constructors
    //----------------------------------------
    
    //----------------------------------------
    //operations
    //----------------------------------------
    public void initUseCase()
    {
        // construct business objects as neccessary
    }//initUseCase
    
    public Scenario getScenario() {
        return scenario;
    }//getScenario

    public WindowMainApp getWindow() {
        return window;
    }//getWindow

    public void setWindow( WindowMainApp window ) {
        this.window = window;
    }//setWindow
    
    public void startAnimation()
    {
        isSimulationRunning = true;
    }//startAnimation
    
    public void animate()
    {
        if ( isSimulationRunning == false ) {
            return;
        }

        // update business model
        ArrayList<Elevator> elevators = ElevatorBank.GetInstance().getElevators();
        for ( Elevator elevator : elevators ) {
            elevator.move();
        }
        
        // update the view
        updateWindow();
    }//animate
    
    void updateWindow()
    {
        // Make sure that the actual update happens on
        // the EDT thread:
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                // this must be done on EDT thread
                window.update();
            }
        });
    }//updateWindow
    
    public void saveScenario( int numberOfFloors, int numberOfElevators )
    {
        // update the scenario object with current user data
        scenario.setNumberOfElevators(numberOfElevators);
        scenario.setNumberOfFloors(numberOfFloors);
        
        // tell the elevator bank to configure
        // floor and elevators:
        ElevatorBank.GetInstance().updateConfiguration(
                numberOfFloors, numberOfElevators
        );
    }//saveScenario                                               

    public void runSimulation() {
        isSimulationRunning = true;
    }//runSimulation                                                

    public void stopSimulation() {
        isSimulationRunning = false;
    }//stopSimulation

    
}//class ControllerDemo