// @topic S-0303-03-01-20 Java MVC Architecture Demo 2
// @brief The use case controller class

package demo;
public class ControllerDemo {
    //----------------------------------------
    // data
    //----------------------------------------
    private FrameMainView window;
    private ElevatorBank elevatorBank;
    //----------------------------------------
    // constructors
    //----------------------------------------
    public ControllerDemo()
    {
    }//ControllerDemo
    
    //----------------------------------------
    //operations
    //----------------------------------------
    public void initUseCase()
    {
        // constructing business objects
        elevatorBank = new ElevatorBank();
        elevatorBank.addElevator( new Elevator( Elevator.maxFloor ) );
        elevatorBank.addElevator( new Elevator( Elevator.minFloor ) );
    }//initUseCase
    
    public FrameMainView getWindow() {
        return window;
    }//getWindow

    public void setWindow(FrameMainView window) {
        this.window = window;
    }//setWindow
    
    public void startAnimation()
    {
        // create and start new thread:
        ThreadAnimation thp = new ThreadAnimation( this );
        Thread th = new Thread( thp );
        th.start();
    }//startAnimation
    
    public void animate()
    {
        // update business model
        elevatorBank.getElevator( 0 ).move();
        elevatorBank.getElevator( 1 ).move();
        // update the view
        displayElevators();
    }//animate
    
    void displayElevators()
    {
        StringBuilder displayGrid = new StringBuilder();
        
        for (
                int floorNumber = Elevator.maxFloor;
                floorNumber >= Elevator.minFloor;
                --floorNumber
                )
        {
            // for each floor
            for ( Elevator elevator : elevatorBank.getElevatorCollection() ) {
                // for each elevator
                if ( floorNumber == elevator.getFloor() ) {
                    displayGrid.append( "   " + floorNumber );
                } else {
                    displayGrid.append( "   :" );
                }
            }
            displayGrid.append( '\n' );
        }
        
        // 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.getAreaDisplayElevators().setText(
                    displayGrid.toString()
                );
            }
        });
        
    }//displayElevators
    
}//class ControllerDemo