package tools;
import java.io.File ;
import java.io.PrintWriter;
import java.util.Vector;

import org.w3c.dom.* ;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

public class AuthorityReader {

	
		public static String readField(Element element, String tagName) {
			try {
				NodeList nodeList = element.getElementsByTagName(tagName) ;
				Element tagElement = (Element) nodeList.item(0) ;
				NodeList textList = tagElement.getChildNodes() ;
				return ((Node) textList.item(0)).getNodeValue().trim() ;
			}
			catch (Exception e) {
				return null ;
			}
		}
		
		public static void mains(String [] args) {
			try {
				DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
				DocumentBuilder docBuilder = docFactory.newDocumentBuilder() ;
				try {
					Document doc = docBuilder.parse(new File("films.xml")) ;
					doc.getDocumentElement().normalize() ;
					
					Vector movieList = new Vector(1) ;
					NodeList list = doc.getElementsByTagName("VED_FILM") ;
					System.out.println("Number of movies: " + list.getLength()) ;
					for (int i = 0 ; i < list.getLength() ; i ++ ) {
						Node curMovieNode = list.item(i) ;
						if (curMovieNode.getNodeType() == Node.ELEMENT_NODE) {
							Element movie = (Element) curMovieNode ;
							
							movieList.add(new MovieFrance(
									readField(movie, "ANNEE_PRODUCTION"),
									readField(movie, "ANNE_PROD_PRESUMEE"),
									readField(movie, "DATE_CREATION"),
									readField(movie, "DATE_MODIFICATION"),
									readField(movie, "DATE_TERMINE"),
									readField(movie, "DATE_VALIDATION"),
									readField(movie, "EXPORT"),
									readField(movie, "FK_PAYS"),
									readField(movie, "GENERIQUE_CONTROLE"),
									readField(movie, "GENERIQUE_TERMINE"),
									readField(movie, "PK"),
									readField(movie, "PK_C1"),
									readField(movie, "STATUT"),
									readField(movie, "STATUT_FILM"),
									readField(movie, "TERMINE"),
									readField(movie, "TITRE_COMPLET_ORI"),
									readField(movie, "TITRE_EN_FRANCAIS"),
									readField(movie, "TITRE_ORIGINAL"),
									readField(movie, "TITRE_ORI_COMPLET"),
									readField(movie, "UFK_PAYS"),
									readField(movie, "UID_CREATION"),
									readField(movie, "UID_MODIFICATION"),
									readField(movie, "UID_TERMINE"),
									readField(movie, "UID_VALIDATION"),
									readField(movie, "TITRE_RECHERCHE"))) ; 
						}
					}
					PrintWriter out = new PrintWriter(new File("movies.txt")) ;
					for (int i = 0 ; i < movieList.size(); i ++) {
						MovieFrance curMovie = (MovieFrance) movieList.get(i) ;
						out.println(i + "@" + curMovie) ;
					}
					/*
					int [] [] d = new int [movieList.size() + 1] [movieList.size() + 1] ;
					for (int i = 0 ; i < movieList.size() ; i ++) {
						MovieFrance ma = (MovieFrance) movieList.get(i) ;
						System.out.println(i + "/" + movieList.size()) ;
						for (int j = 0 ; j < movieList.size() ; j ++) {
							
							MovieFrance mb = (MovieFrance) movieList.get(j) ;
							d [i] [j] = StringCompare.editDistance(ma.anneProdPresumee, mb.anneProdPresumee) +
										StringCompare.editDistance(ma.anneProduction, mb.anneProduction) +
										StringCompare.editDistance(ma.titreEnFrancais, mb.titreEnFrancais) ;
							out.println(i + "  " + j + " " + d [i] [j]) ;
						}
					}
					int count = movieList.size() ;
					double average = 0.0, total = 0.0 ;
					for (int i = 0 ; i < count ; i ++)
						for (int j = 0 ; j < count ; j ++)
							total += d [i] [j] ;
					average = total / (count * count) ;
					out.println(average) ;
					double stAverage = 0.0, stTotal = 0.0 ;
					for (int i = 0 ; i < count ; i ++)
						for (int j = 0 ; j < count ; j ++)
							stTotal += (d [i] [j] - average) * (d [i] [j] - average) ;
					stAverage = Math.sqrt(stTotal / (count * count)) ;
					out.println(stAverage) ;
					*/
					out.flush() ;
				}
				catch (Exception e) {
					System.out.println("Exception: " + e) ;
				}
				
				
			}
			catch (Exception e) {
				
			}
		}
}
