
/**
 * MapaTransportes: todos os transportes realizados por todos os camiões
 * de uma empresa de transportes de Carga
 * 
 * @author FMM 
 * @version 7/2009
 */
import java.util.*;
public class MapaTransportes {
   
   private TreeMap<String, ArrayList<Transporte>> mapaTrans =
      new TreeMap<String, ArrayList<Transporte>>();
 

   public MapaTransportes(TreeMap<String, ArrayList<Transporte>> mt) {
       ArrayList<Transporte> copia = new ArrayList<Transporte>();
       for(String matric : mt.keySet()) { // para cada matrícula
           // vamos aceder ao ArrayList<Transporte> anual 
           for(Transporte t : mt.get(matric)) copia.add(t.clone());
               // cada uma destas List<Transporte> é copiada para a Lista auxiliar                  
           // agora associamos a Lista cópia à matricula no TreeMap
           mapaTrans.put(matric, copia); 
           // a apagamos a lista auxiliar
           copia.clear();
       }
    }
 
   public int pesoTotal(String mat) {
      int peso = 0;
      ArrayList<Carga> cargas = new ArrayList<Carga>();
      ArrayList<Transporte> transp = mapaTrans.get(mat);
      for(Transporte trsp : transp) { 
          cargas = trsp.getCargas();
          for(Carga c : cargas) 
             if(c instanceof Peso) peso += ((Peso) c).getPeso();
      }          
      return peso;
   }
   
   public Set<String> matCamioesDestino(String destino) {
       Set<String> res = new TreeSet<String>();
       List<Carga> cargas = new ArrayList<Carga>();
       for(String matric : mapaTrans.keySet())  // para cada matrícula
           // vamos aceder ao ArrayList<Transporte> anual 
           for(Transporte t : mapaTrans.get(matric)) {
               cargas = t.getCargas();
               for(Carga c : cargas)
                     if(c.getDestino().equals(destino)) res.add(t.getMatric()); 
           }
       return res;
}

  // Esta questão tem uma solução que corresponde ao total de km das cargas
  // transportadas; se 2 cargas foram transportadas a 2000 Km dará 4000 Km.
  // Se tivéssemos que distinguir por destinos tal seria muito mais complexo,
  // mas, ainda assim, muito mais interessante. Não é o caso.
  // Assim, deveremos começar por programar um método auxiliar que nos diga
  // quantos Kms o camião de matrícula matric percorreu.
  public double kmsPorCamiao(String matric) {    
       double totalKmsCamiao = 0.0;
       for(Transporte t : mapaTrans.get(matric)) {
            List<Carga> cargas = t.getCargas(); 
            for(Carga c : cargas) totalKmsCamiao += c.getKms();
       }
       return totalKmsCamiao;
  }
  
   public String camiaoComMaisKms() {
       String mat = "";
       double kms = 0.0;
       double maxKms = Double.MIN_VALUE;
       for(String matric : mapaTrans.keySet()) { 
           kms = this.kmsPorCamiao(matric); 
           if(kms > maxKms) { maxKms = kms; mat = matric; }
        }
       return mat;
   }         
}
          
     

