package org.greenstone.atlas.server;

import gate.Annotation;
import gate.AnnotationSet;
import gate.Corpus;
import gate.Document;
import gate.Factory;
import gate.FeatureMap;
import gate.Gate;
import gate.GateConstants;
import gate.creole.ANNIEConstants;
import gate.creole.SerialAnalyserController;
import gate.util.GateException;
import gate.util.Out;
import gate.util.persistence.PersistenceManager;

import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;

import org.apache.log4j.BasicConfigurator;

public class GateScanner 
{
	private SerialAnalyserController annieController;

	public GateScanner()
	{
		try 
		{
			BasicConfigurator.configure();
			Gate.setGateHome(new File("C:\\Users\\sjm84\\Desktop\\Gate"));
			Gate.setPluginsHome(new File("C:\\Users\\sjm84\\Desktop\\Gate\\plugins"));
			Gate.setUserConfigFile(new File("C:\\Users\\sjm84\\Desktop\\Gate\\gate.xml"));
			Gate.init();
			Gate.getCreoleRegister().registerDirectories(new File("C:\\Users\\sjm84\\Desktop\\Gate\\plugins\\ANNIE").toURI().toURL()); 
			Gate.getUserConfig().put(GateConstants.DOCUMENT_ADD_SPACE_ON_UNPACK_FEATURE_NAME, new Boolean(false));
			
		    Out.prln("Initialising ANNIE...");
		
			annieController = (SerialAnalyserController) PersistenceManager.loadObjectFromFile(new File(new File(Gate.getPluginsHome(), ANNIEConstants.PLUGIN_DIR), ANNIEConstants.DEFAULT_FILE));
		
		    Out.prln("...ANNIE loaded");
		} 
		catch (Exception e) 
		{
			e.printStackTrace();
		}
	}
	
	/** Tell ANNIE's controller about the corpus you want to run on */
	public void setCorpus(Corpus corpus) 
	{
		annieController.setCorpus(corpus);
	} // setCorpus

	/** Run ANNIE */
	public void execute() throws GateException 
	{
	    Out.prln("Running ANNIE...");
	    annieController.execute();
	    Out.prln("...ANNIE complete");
	} // execute()
	
	public HashMap<String, Word> classifyText(String originalText)
	{
		HashMap<String, Word> words = new HashMap<String, Word>();
		try
		{
		    Corpus corpus = (Corpus) Factory.createResource("gate.corpora.CorpusImpl");
		    FeatureMap params = Factory.newFeatureMap();
		    params.put("stringContent", "<html><head></head><body>" + originalText + "</body></html>");
		    params.put("preserveOriginalContent", new Boolean(true));
		    params.put("collectRepositioningInfo", new Boolean(true));
		    Document doc = (Document) Factory.createResource("gate.corpora.DocumentImpl", params);
		    corpus.add(doc);
	
		    // tell the pipeline about the corpus and run it
		    this.setCorpus(corpus);
		    this.execute();	    
		    
		    AnnotationSet annotations = doc.getAnnotations();
		    
		    for(int j = 0; j < annotations.size(); j++)
		    {
		    	Annotation currentAnnotation = annotations.get(j);
		    	
		    	if(currentAnnotation == null)
		    	{
		    		continue;
		    	}
		    	if(currentAnnotation.getType().equals("Token"))
		    	{
		    		Word w = null;
		    		if(words.containsKey((String)currentAnnotation.getFeatures().get("string")))
		    		{
		    			w = words.get((String)currentAnnotation.getFeatures().get("string"));
		    			w.addClassification((String)currentAnnotation.getFeatures().get("category"));
		    			w.setValue((String)currentAnnotation.getFeatures().get("string"));
		    		}
		    		else
		    		{
		    			w = new Word();
		    			w.addClassification((String)currentAnnotation.getFeatures().get("category"));
		    			w.setValue((String)currentAnnotation.getFeatures().get("string"));
		    			words.put(w.getValue(), w);
		    		}
		    	}
		    }
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
		
	    return words;
	}
}