/*
 * Created on 10.02.2005
 *
 * $Id: Taxi.java,v 1.1 2005/06/24 13:56:05 boehm Exp $
 */
package space;

import java.util.*;

import space.annotation.*;

/**
 * @author <a href="mailto:boehm@javatux.de">oliver</a>
 * @since 10.02.2005
 * @version $revision$
 */
@Copyright("(c) 2005 HAL-Oli B.")
@Licence("GPL")
public class Taxi {

    /** Preis pro Meile */
    @Constant
    @Tariff
    private double mileageFare = 0.2;
    
    /** Preis pro Minute */
    @Constant
    private double minuteFare = 0.5;
    
    /** Grundgebuehr */
    @Constant
    private Integer basicFee = 2;
    
    /** Taxifahrer */
    @Human
    private TaxiDriver driver = new TaxiDriver("Theo");
   
    /** max. 4 Passagiere gehen rein */
    @Persistent
    private List<Passenger> list = new Vector<Passenger>(4);
    
    /**
     * Neuer Fahrgast steigt ein und setzt sich auf den naechsten
     * freien Platz.
     * @throws PassengerException 
     */
    @Critical
    @Modification
    public void enter(Passenger passenger) throws PassengerException {
        if (this.isFull()) {
            throw new PassengerException("Taxi already full!");
        }
        list.add(passenger);
    }
    
    /**
     * Fahrgast Nummer n wird rausgeschmissen.
     * @param n Fahrgastnummer (1 - 4)
     */
    @Modification
    public void leave(int n) {
        list.remove(n-1);
    }
    
    @Modification
    public void leave(Passenger passenger) {
        list.remove(passenger);
    }
    
    @Modification
    public void leaveAll() {
        list.removeAll(list);
    }
    
    /**
     * Zum Schluss sicherheitshalber alle Passagiere rausschmeissen.
     */
    protected void finalize() {
        leaveAll();
    }
    
    /**
     * Get Number of Passengers
     * @return Anzahl der Passagiere
     */
    @Query
    public int getNoPassengers() {
        return list.size();
    }
    
    /**
     * Liefert den Passagier auf Sitzplatz n zurueck. Falls da keiner sitzt,
     * wird null zurueckgegeben.
     * 
     * @param n Sitzplatz-Nummer (1 - 4)
     * @return Passagier auf Platz n
     */
    @Query
    public Passenger getPassenger(int n) {
        try {
            return list.get(n-1);
        } catch (ArrayIndexOutOfBoundsException e) {
            return null;
        }
    }
    
    /**
     * Ist das Taxi leer?
     * @return true, wenn das Taxi leer ist
     */
    @Query
    public boolean isEmpty() {
        return list.size() == 0;
    }
    
    /**
     * Ist das Taxi voll?
     * @return true, wenn das Taxi voll ist
     */
    @Query
    public boolean isFull() {
        return getNoPassengers() >= 4;
    }
    
    /**
     * Alles ok mit dem Taxi?
     * @return
     */
    @Dummy
    @Query
    public boolean isOK() {
        return true;
    }

}
