/**
   * This method checks both elevators to determine if one is on the floor where this passenger is
   * attempting to board.
   *
   * <p>It returns a reference to the elevator or a null if no elevator is available.
   *
   * @return available elevator or a null if no elevator is available.
   */
  private static Elevator findElevator(Passenger passenger) {
    Elevator foundElevator = null;

    if (elevator1.isElevatorHere(passenger)) {
      foundElevator = elevator1;
    } else if (elevator2.isElevatorHere(passenger)) {
      foundElevator = elevator2;
    }

    return foundElevator;
  } //  end findElevator
  /**
   * This method performs reporting at the end of the workday. It indicates that the elevators have
   * stopped service and reports passenger counts.
   */
  private static void endOfDay() {

    System.out.println();
    System.out.println("End of workday. Elevators stopping service.");
    System.out.println(
        "Stopping elevator 1 with "
            + elevator1.getTotalPassengers()
            + " onboard."); // changed method from getPassengerCount() to getTotalPassengers()
                            // edited by MAGNUM
    System.out.println(
        "Stopping elevator 2 with "
            + elevator2.getTotalPassengers()
            + " onboard."); // changed method from getPassengerCount() to getTotalPassengers()
                            // edited by MAGNUM
  } //  end endOfDay
 /** This method tells both elevators that one time unit has passed. */
 private static void recordTick() {
   //  tell each elevator that one unit of time has passed
   System.out.println("Tick.");
   elevator1.tick();
   elevator2.tick();
 } //  end recordTick
  /**
   * Read and process each item in the simulation file. It reads each input item in the file. If a
   * PASSENGER entry, a passenger object is created, and the elevators are checked to see if one is
   * available to service this passenger. If so, the passenger is logically added to the elevator.
   * If an elevator is not available, the passenger must take the stairs.
   *
   * <p>If the input item is a TICK, it indicates that one time unit has passed. At EOF, the method
   * is invoked to shut the elevators down and perform the end of day processing.
   *
   * <p>If an error is detected at any time, this method returns the proper boolean to the calling
   * method.
   *
   * @return True or False to indicate an error
   */
  private static boolean processSimulationFile() {

    // local constants used by this method

    final String PASSENGER = "passenger";
    final String TICK = "tick";
    final String SIMULATION_END = "done";

    boolean done = false; // set when done
    boolean error = false; // set if error detected
    boolean addedOK = false; // set if no elevator is available
    Passenger newPass = null; // new passenger object
    Elevator availableEl = null; // elevator object

    // Read next token from file and process

    try {
      while (!done && !error && in.nextToken() != in.TT_EOF) {

        if (in.sval.equals(PASSENGER)) {
          //  if a new passenger, create a new object, look
          //  for an elevator and add to elevator.  If elevator
          //  is not available, passenger takes the stairs.

          newPass = newPassenger();
          availableEl = findElevator(newPass);
          if (availableEl == null) takingStairs(newPass);
          else {
            System.out.print(
                "Passenger: "
                    + newPass.getName()
                    + " arrives on floor "
                    + newPass.getFloor()
                    + ".");
            addedOK = availableEl.addPassenger(newPass);
            if (!addedOK) {
              error = true;
            }
          }
        } else if (in.sval.equals(TICK)) {
          // token read from file is a time indicator
          recordTick();

        } else if (in.sval.equals(SIMULATION_END)) {
          // end of file == end of workday
          done = true;
        } else {
          error = true;
        }
      } // end while

      if (in.nextToken() == in.TT_EOF) {
        //  perform end of day reporting
        endOfDay();
      }

      // catch for file exception
    } catch (IOException e) {
      error = true;
    } // end try

    return error;
  } //  end processSimulationFile