import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;
import java.util.regex.Pattern;

import com.hp.hpl.jena.ontology.OntClass;
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.util.iterator.ExtendedIterator;


public class Affichage {
	
	static String dir = "file:C:\\Documents and Settings\\MAL\\Mes documents\\sonet\\trunk\\ontologies\\";
	static String Fonto = dir + "FarshidPlantEntities_v2.0.owl";
	static String POonto = dir + "po_anatomy.owl";
	
	public static void main(String args[]){
		
		Fonto = "file:"+args[0];
		POonto = "file:"+args[1];
		
		// models creation
		OntModel m = ModelFactory.createOntologyModel(); 
		OntModel mTO = ModelFactory.createOntologyModel();
		
		//Reading models
		m.read(Fonto, "RDF/XML"); 
		mTO.read(POonto, "RDF/XML");
		System.out.println("model 1 size "+m.size());
		System.out.println("model 2 size "+mTO.size());
		
		
		m.add(mTO);
		//System.out.println(m.size());
		
		ExtendedIterator<OntClass> classeIt = m.listClasses();
		List <String> classeList = new ArrayList <String> ();
		Set <String> classeName = new TreeSet <String> ();
		Set<String> perfectmatch = new TreeSet<String>();
		//int cpt = 0;
		while(classeIt.hasNext()){
			OntClass classe = classeIt.next();
			//cpt++;
			if(classe.getLabel(null) != null){
				classeList.add(classe.getLabel(null).trim().toLowerCase().replaceAll(" ", "")+"		"+classe.getLabel(null)+"	 "+classe.getNameSpace());
				if(classeName.contains(classe.getLabel(null).trim().toLowerCase().replaceAll(" ", ""))){
					perfectmatch.add(classe.getLabel(null));
				}
				else{
					classeName.add(classe.getLabel(null).trim().toLowerCase().replaceAll(" ", ""));
				}
				
				//System.out.println(classe.getLabel(null));
			}else if (classe.getLocalName() != null){
				classeList.add(classe.getLocalName().trim().toLowerCase().replaceAll(" ", "")+"		"+classe.getLocalName()+"	 "+classe.getNameSpace());
				if(classeName.contains(classe.getLocalName().trim().toLowerCase().replaceAll(" ", ""))){
					perfectmatch.add(classe.getLocalName());
				}
				else {
					classeName.add(classe.getLocalName().trim().toLowerCase().replaceAll(" ", ""));
				}
				//System.out.println(classe.getLocalName().toLowerCase().trim());
			}
			//System.out.println(classe.getURI());
		}
		//System.out.println(cpt);
		System.out.println("----------");
		//System.out.println(classeName);
//		Set <String>match = new HashSet<String>();
//		match.addAll(classeList);
//		match.removeAll(classeName);
		//classeName.removeAll(match);
		//System.out.println(classeList.size());
		//System.out.println(match);
//		System.out.println("perfect matches : "+ classeName.size()+" "+match.size());
		
		Collections.sort(classeList);
		//System.out.println(classeList);
		
		
		Map <String, String>matche = new TreeMap<String, String>();
		Iterator <String> it = classeList.iterator();
		while (it.hasNext()){
			String cl = it.next();
			String[] info = cl.split("\t");
			
			Iterator<String> it2 = classeList.iterator();
			while(it2.hasNext()){
				String cl2= it2.next();
				String[] info2 = cl2.split("\t");
				//System.out.println("TOTO cl2"+cl2+" info1 "+ info[0]);
				Pattern p = Pattern.compile("^"+info2[0]+"|"+info2[0]+"$"); 
				if(!info[0].equalsIgnoreCase(info2[0]) && !info[3].equalsIgnoreCase(info2[3]) && p.matcher(info[0]).find()){
					//System.out.println("classe : " +info[2]+ " onto : "+ info[3]+ " est eq à : "+ cl2);
					if(matche.containsKey(info[2]+";"+info[3])){
						matche.put(info[2]+";"+info[3], matche.get(info[2]+";"+info[3])+";"+ info2[2]);
					}else{
						matche.put(info[2]+";"+info[3], info2[2]);
					}
				}			
			}
			//System.out.println(info[2]+ " "+ info[3]);
			
		}
		System.out.println("perfect matches : "+ perfectmatch.size());
		System.out.println("approximative matches : "+matche.keySet().size());
		
		//System.out.println(matche.keySet().size()+perfectmatch.size());
		
		
		try {
			PrintStream l_out = new PrintStream(new FileOutputStream("match.csv"));
		//Arrays.sort(classeList.toArray());
		//System.out.println(perfectmatch.size());
		Iterator toto = perfectmatch.iterator();
		while(toto.hasNext()){
			String st = (String) toto.next();
			l_out.println(st);
			//System.out.println(st);
			
		}
		
		//Arrays.sort(matche.keySet().toArray());
		Iterator <String>i = matche.keySet().iterator();
		while (i.hasNext()){
			String am = i.next();
			String [] temp = am.split(";");
			String [] tmp = temp[1].split("/");
			
			l_out.print(temp[0]+";"+tmp[tmp.length-1].replace("#", "")+";");
			l_out.println(matche.get(am));
		}
			
			
			

			//on ferme le fichier :
			l_out.flush();
			l_out.close();
			l_out=null;
			}
			catch(Exception e){System.out.println(e.toString());}
			 	
	}
}
