package buslines;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @author Daniel "3ICE" Berezvai
 */
public class Busline extends ArrayList<Stop> {

private int id;

public int getId() {
  return id;
}

public void setId(int id) {
  this.id = id;
}
private int maxPassengers;

public int getMaxPassengers() {
  return maxPassengers;
}
private List<Passenger> passengers;

public Busline(int id, int maxPassengers) {
  this.id = id;
  this.maxPassengers = maxPassengers;
  passengers = new ArrayList<>();
}

public int passengerCount() {
  return passengers.size();
}

public void tick(Date timestamp, StringBuilder log) {
  if (timestamp.before(this.get(0).getTimestamp())) {
    return;
  }
  passengersExit(log);
  if (this.size() > 0) {
    passengersBoard(log);
  }
  this.remove(0);
}

@Override
public String toString() {
  if (passengers.isEmpty()) {
    return "";
  }
  StringBuilder sb = new StringBuilder("Bus.Busline[id=" + id + "]\n");
  sb.append("Travelling here are: ");
  for (Passenger passenger : passengers) {
    sb.append(passenger.getName());
    sb.append(' ');
  }
  sb.append('\n');
  return sb.toString();
}

private void passengersExit(StringBuilder log) {
  int i = 0;
  while (i < passengers.size()) {
    if (passengers.get(i).getDestination().equals(this.get(0).getStation())) {
      log.append("Passenger ");
      log.append(passengers.get(i).getName());
      log.append(" gets off Busline #");
      log.append(this.getId());
      log.append(".\n");
      passengers.remove(i);
    } else {
      ++i;
    }
  }
}

private void passengersBoard(StringBuilder log) {
  Passenger p;
  int i = 0;
  while (i < this.size()) {
    if (this.passengerCount() == this.getMaxPassengers()) {
      log.append("Busline #");
      log.append(this.getId());
      log.append(" is full.\n");
      return;
    }
    if (this.hasStop(this.get(0).getPassenger(i).getDestination())) {
      p = this.get(0).passengerBoard(i);
      passengers.add(p);
      log.append("Passenger ");
      log.append(p.getName());
      log.append(" boards Busline #");
      log.append(this.getId());
      log.append(".\n");
    } else {
      ++i;
    }
  }
}

private boolean hasStop(Station destination) {
  for (Stop stop : this) {
    if (stop.getStation().equals(destination)) {
      return true;
    }
  }
  return false;
}
}
