// @topic S-0330-14-15-50 Java MVC JTable Demo
// @brief class ElevatorBank (singleton, Data Model Tier)

package gui_demo;

import java.util.ArrayList;

public class ElevatorBank {

    //------------------------------
    // singleton design support
    //------------------------------
    private static Mutex mMutex = new Mutex();
    private static ElevatorBank mInstance = null;

    //------------------------------
    // data
    //------------------------------
    private ArrayList< Elevator> elevators;
    private ArrayList< Floor> floors;

    //------------------------------
    // constructors
    //------------------------------
    public ElevatorBank() {
        elevators = new ArrayList<>();
        floors = new ArrayList<>();
    }//ElevatorBank

    //------------------------------
    // operations
    //------------------------------
    public static ElevatorBank GetInstance() {
        Lock lock = new Lock(mMutex); // automatically locks

        if (mInstance == null) {
            mInstance = new ElevatorBank();
        }
        lock.release(); // don't forget to unlock

        return mInstance;
    }//GetInstance

    public void addElevator(Elevator elevator) {
        elevators.add(elevator);
    }//addElevator

    public Elevator getElevator(int elevatorSeqNumber) {
        return elevators.get(elevatorSeqNumber);
    }//getElevator

    public ArrayList<Elevator> getElevators() {
        return elevators;
    }//getElevators

    public void addFloor(Floor floor) {
        floors.add(floor);
    }//addFloor

    public Floor getFloor(int floorSeqNumber) {
        return floors.get(floorSeqNumber);
    }//getFloor

    public ArrayList<Floor> getFloors() {
        return floors;
    }//getFloors

    public void updateConfiguration(int numberOfFloors, int numberOfElevators) {
        elevators.clear();
        floors.clear();
        // populate the floors
        for ( int idx = 0; idx < numberOfFloors; ++idx ) {
            Floor floor = null;
            if (idx == 0) {
                floor = new Floor( "P" );
            } else if (idx == 1) {
                floor = new Floor( "G" );
            } else {
                floor = new Floor( Integer.toString( idx ) );
            }
            addFloor( floor );
        }
        // populate the elevators
        for ( int idx = 0; idx < numberOfElevators; ++idx ) {
            Elevator elevator = null;
            char elevatorLabel = 'A';
            elevatorLabel += (char)idx;
            elevator = new Elevator( Character.toString( elevatorLabel ), idx );
            addElevator( elevator );
        }
    }//updateConfiguration

}//class ElevatorBank