package libro;
import autore.*;
import java.util.*;

public class Libro implements Cloneable {
  private String titolo;
  private Autore autore;
  private String casaeditrice;
  private int anno;
  
  public Libro(String t, Autore au, String c, int an){
    titolo = t;
    autore = au;
    casaeditrice = c;
    anno = an;
  }

  public String getTitolo() {
    return titolo;
  }
  public Autore getAutore() {
    return autore;
  }
  public String getCasaEditrice() {
    return casaeditrice;
  }
  public int getAnno() {
    return anno;
  }
  
  public boolean equals(Object o) {
    if (o!=null && getClass().equals(o.getClass())){
      Libro l = (Libro)o;
      return 
        titolo.equals(l.titolo) && 
        autore.equals(l.autore) &&
        casaeditrice.equals(l.casaeditrice) && 
        anno == anno;
    }
    return false;
  }

  public int hashCode() {
    int ris = titolo.hashCode(); 
    ris = 31*ris + autore.hashCode();  //31 e' un numero primo
    ris = 31*ris + casaeditrice.hashCode();
    ris = 31*ris + anno;
    return ris;
  }
    

  public Object clone() {
    try {
      Libro l = (Libro)super.clone();
      //la copia campo a campo fornita sa clone() in Object fa gia la
      //cosa corretta: le stringhe sono immutabili quindi e' inutile
      //farne copia; autore e' in sharing, il libro contiene
      //l'identificatore dell'oggetto autore, non l'oggetto stesso;
      //infine int e' in tipo predefinito quindi la copia campo a
      //campo e' quello che serve
      return l;  //nota il casting in questo caso e' inutile
    } catch (CloneNotSupportedException e) {
      throw new InternalError("E' successo l'impossibile");
    }
  }
      
  public String toString(){
    return titolo + ", " + autore + ", " + casaeditrice + ", " + anno;
  }
}
