import java.util.HashMap;
import java.util.Iterator;

/**
 * Archive for storing and retrieving 
 * information about my mp3 collection.
 */
public class MusicArchive {
  
  HashMap map = null;

  public MusicArchive(){
    map = new HashMap();
  }

  public void addMusic(MusicIndex index, MusicData data){
    map.put(index, data);
  }

  public MusicData getMusic(MusicIndex index){
    MusicData data = (MusicData)map.get(index);
    print(index, data);
    return data;
  }

  public void printArchive(){
    System.out.println("\n*** printing archive ***");
    Iterator iter = map.keySet().iterator();
    while (iter.hasNext()) {
      MusicIndex index = (MusicIndex) iter.next();
      MusicData data = (MusicData) map.get(index);
      print(index, data);   
    }
    System.out.println("************************");
  }

  private void print(MusicIndex index, MusicData data){
    if (data == null){
      System.out.println("no data found for index = " + index);
    } else { 
      System.out.println(index + ": " + data);
    } 
  }

  public static void main(String[] args){
    MusicArchive ma = new MusicArchive();
    
    MusicIndex i1 = new MusicIndex(10001, "paul");
    ma.addMusic(i1, new MusicData("sean paul", "getbusy.mp3", 2003));
    
    MusicIndex i2 = new MusicIndex(72093, "xta");
    ma.addMusic(i2, new MusicData("christina", "dirrty.mp3", 2002));
    
    MusicIndex i3 = new MusicIndex(42342, "off");
    ma.addMusic(i3, new MusicData("offspring", "bad habit.mp3", 1994));
    
    MusicIndex i4 = new MusicIndex(83798, "brit");
    ma.addMusic(i4, new MusicData("britney", "oops.mp3", 2000));

    ma.printArchive();
    
    System.out.println("\nsearching index 10001/paul:");
    ma.getMusic(i1);
    
    System.out.println("\nsearching index 10001/paul:");
    ma.getMusic(new MusicIndex(10001, new String("paul")));
    
//    // uncomment the following lines for exercise 3...
//    // oups, bad name used! change it...
//    i1.setDescription("sean");
//    MusicIndex i5 = new MusicIndex(99876, "paul");
//    ma.addMusic(i5, new MusicData("mccartney", "tuesday", 1999));
//    
//    System.out.println("\nsearching now corrected index 10001/sean:");
//    ma.getMusic(i1);
//    ma.printArchive();
  }
}

/**
 * MusicIndex is used as the unique index 
 * to store & retrieve the musicdata in my
 * music archive.
 */
class MusicIndex {
  
  int id = 0;
  String description = null;

  public MusicIndex(int id, String description){
    this.id = id;
    this.description = description;
  }

  public void setDescription(String description) {
    this.description = description;
  }

  public void setId(int id){
    this.id = id;
  }

  public String toString(){
    return "id=" + id + " / description=" + description;
  }
}

/**
 * MusicData contains all the information of interest
 * about one of my music files.
 */
class MusicData {

  String artist;
  String filename;
  int year;
  
  public MusicData(String artist, String filename, int year) {
    this.artist = artist;
    this.filename = filename;
    this.year = year;
  }

  public String toString() {
    return artist + ", " + filename + "(" + year + ")";
  }
}
