/**
 * Parque.
 * 
 * @author DCC+PRH
 * @version 02.05.2006
 */
public class Parque
{
    // instance variables
    private final int MaxP = 100;
    
    private String PId; 
    private int Capacid;
    private char Destino; //F-funcionario;S-staff(F+C);A-aluno;T-todos(F+C+A)
    private int In;
    private int Out;
    private int Ocupa;
    private Utente[] Presentes;

    /**
     * Constructor for objects of class Parque
     */
    public Parque()
    {
        // initialise instance variables
    this.PId = "";  
    this.Capacid = MaxP;
    this.Destino = 'T'; 
    this.In = 0;
    this.Out = 0;
    this.Ocupa = 0;
    this.Presentes = new Utente[this.Capacid];
    }
    public Parque(String id, int cap, char d)
    {
        // initialise instance variables
    this.PId = id;  
    this.Capacid = cap;
    this.Destino = d; 
    this.In = 0;
    this.Out = 0;
    this.Ocupa = 0;
    this.Presentes = new Utente[this.Capacid];
    }

    /**
     * Set and Get Attribute values 
     * 
     */
    // Set attributes (instance variables)
    public void setId(String id)
    {
        this.PId = id;
    }
    public void setCapacid(int cap)
    {
        this.Capacid = cap;
    }
    public void setDestino(char d)
    {
        this.Destino = d;
    }
    public void reset()
    {
        this.In = 0;
        this.Out = 0;
        this.Ocupa = 0;
        this.Presentes = new Utente[this.Capacid];
    }
    // Get Attributes (the value of  instance variables)
    public String getId()
    {
        return this.PId;
    }
    public int getCapacid()
    {
        return this.Capacid;
    }
    public char getDestinatarios()
    {
        return this.Destino;
    }
    public int getEntradas()
    {
        return this.In;
    }
    public int getSaidas()
    {
        return this.Out;
    }
    public int getOcupacao()
    {
        return this.Ocupa;
    }

    /**
     * Procura se o Utente que pretende entrar no Parque 
     * nao esta presente
     */
    
    public boolean isPresent(Utente u)
    {
        boolean is = false;
        int num_Presentes = this.getOcupacao(), i = 0;
        
//        Alternativa:         
//        while(i < this.getOcupacao() && !this.Presentes[i].equals(u)) { i++; }
        for (i = 0; (i < num_Presentes) && (!is); i++)
        {
            if (((Utente)this.Presentes[i]).equals(u)) {
                    is = true;
            }
        }
        return is;
    }
       
    /**
     * Insere 1 novo Utente Autorizado no conjunto dos Presentes no Parque 
     * 
     * @param  u   Utente
     * @return     nada 
     */
    public void Entra(Utente u)
    {
        if (this.isPresent(u)) {
            System.out.println("Erro: Entrada proibida! Utente ja presente no parque!");
        }
        else {
            this.Presentes[this.Ocupa] = u; 
            this.Ocupa++;           
            this.In++;
        }
    }
    
    /**
     * Retira 1 Utente do conjunto dos Presentes no Parque 
     * 
     * @param  u   Utente
     * @return     nada 
     */
    public void Sai(Utente u)
    {
        int e, n = 0;
        String c;
        
        c = u.getCod();
        // encontra o utente na lista de Presentes
        while ((n < this.Ocupa)&&(!(this.Presentes[n].getCod()).equals(c))) { n++; }
        // actualiza a lista - remove o utente da lista de Presentes
        for (e = n; e < this.Ocupa-1; e++)  
        {
           this.Presentes[e] = this.Presentes[e+1];     
        }
       this.Ocupa--;           
       this.Out++;
    }
    
    /**
     * Lista todos os Atributos do Parque 
     * 
     * @param      não tem
     * @return     nada 
     */     
    // Print all the Obj Attributes
    public void mostraParque()
    {
        System.out.println("Identificador do Parque e: "+this.PId);

    }   
}
