package hansen.playground;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;
import java.util.*;
import java.io.*;

public class DVDManager {
    Element root; // Root of document
    Document doc; // JDOM document 
    List dvds; // List of Elements
    int index = -1; // index for current Element in "dvds" 
  
    public void buildDocument(String filename) {
      try {
        SAXBuilder builder = new SAXBuilder();
        doc = builder.build(filename);
        root = doc.getRootElement();
        dvds = root.getChildren();
      } catch (JDOMException e) {
          e.printStackTrace();
      }
    }

    public void setIndex(int i) {
      index = i;
    }
    
    public int getIndex() {
      return index;
    }
    
    public int getNumberOfDvds() {
      return dvds.size();
    }
    
    public String getId() {
      Element dvd = (Element)dvds.get(index); 
      return dvd.getAttributeValue("id");
    }
      
    public String getTitle() {
      Element dvd = (Element)dvds.get(index); 
      return dvd.getChildText("title");
    }
      
    public String getLength() {
      Element dvd = (Element)dvds.get(index); 
      return dvd.getChildText("length");
    }
      
    public ArrayList getActors() {
      Element dvd = (Element)dvds.get(index); 
      List actors = dvd.getChildren("actor");
      ArrayList a = new ArrayList(actors.size());
      for (int i = 0; i < actors.size(); i++) {
        Element actor = (Element)actors.get(i);
        a.add(actor.getText());
      }  
      return a;
    }
      
    public String getActorLines() {
      ArrayList a = getActors();
      String s = "";
      for (int i = 0; i < a.size(); i ++) {
        if (!s.equals("")) s += "\n";
        s += a.get(i);
      }
      return s;
    }
    
    public void updateDVD(String id, String title, String length, ArrayList actors) {
      Element dvd = (Element)dvds.get(index);
      dvd.getAttribute("id").setValue(id);
      dvd.getChild("title").setText(title);
      dvd.getChild("length").setText(length);
      dvd.removeChildren("actor");
      for (int i = 0; i < actors.size(); i++) {
        dvd.addContent(new Element("actor").setText((String)actors.get(i)));
      }  
    }
    
    public void deleteDVD() {
      dvds.remove(index);
    }
    
    public void createDVD(String id, String title, String length, ArrayList actors) {
      Element dvd = new Element("dvd");
      dvd.setAttribute(new Attribute("id", id));
      dvd.addContent(new Element("title").setText(title));
      dvd.addContent(new Element("length").setText(length));
      for (int i = 0; i < actors.size(); i++) {
        dvd.addContent(new Element("actor").setText((String)actors.get(i)));
      }  
      dvds.add(dvd);
    }
    
    public void sort() {
      // Sort does not work with JDOM Beta 8
      Collections.sort(dvds, new SortTitle());
    }

    public void save(String filename) {
      XMLOutputter outputter = new XMLOutputter("  ",true);
      try {
        outputter.setTextNormalize(true);
        FileWriter f = new FileWriter(new File(filename));
        outputter.output(doc, f);
        f.close();
      } catch (IOException e) {
          e.printStackTrace();
      }
    }
    
    public static void main(String[] args) {
      DVDManager d = new DVDManager();
      d.buildDocument(args[0]);
      //ArrayList actors = new ArrayList();
      //actors.add("First actor");
      //actors.add("Second actor");
      //d.updateDVD("New title", "123", actors); 
      //d.createDVD("New title2", "1234", actors); 
      //d.deleteDVD(0);
      //d.deleteDVD(0);
      //d.deleteDVD(0);
      //d.createDVD("New title", "123", actors); 
      //d.updateDVD(0, "Next title", "7913", actors); 
      //d.deleteDVD(0);
      //d.outList();
      //d.sort();
      for (int i = 0; i < d.dvds.size(); i++) { 
        d.setIndex(i);
        System.out.println(d.getTitle() + "/" + d.getLength() + "/" + d.getActors());
      }
    }

   private void outList() {
      XMLOutputter outputter = new XMLOutputter();
      try {
        outputter.output(doc, System.out);
      } catch (IOException e) {
          e.printStackTrace();
      }    
   }  
    
}