
/**
 * Abstract class Carga - write a description of the class here
 * 
 * @author FMM
 * @version 1/7-2009
 */
import java.util.*;
import java.io.Serializable;
public abstract class Carga implements Serializable {
   
   // Variáveis e métodos de classe
   private static double precoKm;
   public static double getPrecoKm() { return precoKm; }
   public static void setPrecoKm(double prKm) { precoKm = prKm; }
   
   private static TreeMap<String, Double> tabPrecos = new TreeMap<String, Double>();
   public static double getPreco(String tipoCarga) { return tabPrecos.get(tipoCarga); }
   public static void setPreco(String tipoCarga, double nvPreco) { tabPrecos.put(tipoCarga, nvPreco); }
   public static double orcamento(Carga c) { return c.calculaPreco(); }
   
   // variáveis de instância
   private String codigo;
   private double kms;
   private String codCliente;
   private String destino;
   private String nomeProd;
   private double precoFinal;
   
   public String getCodigo() { return codigo; }
   public double getKms() { return kms; }
   public String getCliente() { return codCliente; }
   public String getDestino() { return destino; }
   public String getNomeProd() { return nomeProd; }
   public double getPreco() { return precoFinal; }
   
   public Carga() {
       codigo = ""; kms = 0.0; codCliente = "";
       destino = ""; nomeProd = "";
       precoFinal = 0.0;
   }

   public Carga(Carga c) {
       codigo = c.getCodigo(); kms = c.getKms(); codCliente = c. getCliente();
       destino = c.getDestino(); nomeProd = c.getNomeProd();
       precoFinal = orcamento(c);
   }
  
 
   public Carga(String cod, double dist, String cli, String dest, String prod) {
       codigo = cod; kms = dist; codCliente = cli; destino = dest; 
       nomeProd = prod; 
       precoFinal = 0.0;  // tem que ser definido após criar a instância,
                          // porque depende do tipo da instância
   }

   public void setPreco(double preco) { precoFinal = preco; }
   
   public String toString() {
       StringBuilder sb = new StringBuilder();
       sb.append("Tipo de Carga: " + this.getClass().getSimpleName() + "\n");
       sb.append("Codigo Carga: " + this.getCodigo() + "\n");
       sb.append("Codigo Cliente: " + this.getCliente() + "\n");
       sb.append("Destino: " + this.getDestino() + "\n");
       sb.append("Kms: " + this.getKms() + "\n");
       sb.append("Preço: " + this.calculaPreco() + "\n");
       return sb.toString();
  }
   
   public boolean equals(Object o) {
      if(this == o) return true;
      if( (o == null) || (this.getClass() != o.getClass()) ) return false;
      Carga c = (Carga) o;
      return c.hashCode() == this.hashCode();
   }
   
   public int hashCode() {
       return codigo.hashCode() + ((int) kms)*3 + codCliente.hashCode() + 
              destino.hashCode() + nomeProd.hashCode();
   }
    
   public abstract double calculaPreco(); 
   public abstract Carga clone();
     
}
