package eu.dnetlib.functionality.webInterface.app;

import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;

import eu.dnetlib.domain.data.MDFormatDataStructure;
import eu.dnetlib.domain.functionality.LayoutField;
import eu.dnetlib.domain.functionality.MDFormatSearchCriteria;
import eu.dnetlib.domain.functionality.WebInterfaceLayout;
import gr.uoa.di.driver.enabling.ISLookUp;
import gr.uoa.di.driver.enabling.ISLookUpException;

public class IndexLayoutManagerImpl implements IndexLayoutManager{

	private Logger logger = Logger.getLogger(this.getClass());

	private ISLookUp<MDFormatDataStructure> lookup = null;
	private WebInterfaceLayout webLayout = null;
	private IndexLayout indexLayout = null;

	private List<LayoutField> indexableFields = new ArrayList<LayoutField>();
	private List<LayoutField> resultFields = new ArrayList<LayoutField>();
	private List<LayoutField> statFields = new ArrayList<LayoutField>();
	private List<LayoutField> tokenizableFields = new ArrayList<LayoutField>();

	public ISLookUp<MDFormatDataStructure> getLookup() {
		return lookup;
	}

	public void setLookup(ISLookUp<MDFormatDataStructure> lookup) {
		this.lookup = lookup;
	}
	
	public WebInterfaceLayout getWebLayout() {
		return webLayout;
	}

	public void setWebLayout(WebInterfaceLayout webLayout) {
		this.webLayout = webLayout;
	}

	public IndexLayout getIndexLayout() {
		return indexLayout;
	}

	public void init() {

		logger.info("Getting index layout with name " + this.webLayout.getIndexLayoutName()
				+ " from " + this.webLayout.getMdFormatName() + "...");
		
		MDFormatDataStructure mdFormat = null;
		MDFormatSearchCriteria criteria = new MDFormatSearchCriteria();
		criteria.setMDFormatName(webLayout.getMdFormatName());
		IndexLayout layout = null;
		try {
			List<MDFormatDataStructure> list = lookup.fetch(criteria);
			
			if (list.size() > 0) {
				mdFormat = lookup.fetch(criteria).get(0);
				layout = new IndexLayout(webLayout.getIndexLayoutName(), webLayout.getMdFormatName());				
			}
		
		} catch (ISLookUpException ise) {
			logger.error("Failed to get " + webLayout.getMdFormatName() + " from IS. Use default Layout", ise);
		//	layout = generateDefaultLayout();
		}
		
		if (layout == null) {
			logger.debug("Index layout not found. Generating default");
		//	layout = generateDefaultLayout();
		}
		
		layout.setLayoutFields(mdFormat.getLayouts().get(webLayout.getIndexLayoutName()));
		updateLists(layout);
		this.indexLayout = layout;
	}
/*
	private IndexLayout generateDefaultLayout(){
		IndexLayout layout = new IndexLayout("index", "DMF");

		LayoutField field = null;
		List<LayoutField> layouts = layout.getLayoutFields();

		// thank you vim!
		field = new LayoutField();
		field.setName("CobjContentSynthesis");
		field.setXpath("//dr:CobjContentSynthesis");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjTypology");
		field.setXpath("//dr:CobjTypology");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjIdentifier");
		field.setXpath("//dr:CobjIdentifier");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjModel");
		field.setXpath("//dr:CobjModel");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjMDFormats");
		field.setXpath("//dr:CobjMDFormats");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjDescriptionSynthesis");
		field.setXpath("//dr:CobjDescriptionSynthesis");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("aggregatorName");
		field.setXpath("//dr:aggregatorName");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("aggregatorInstitution");
		field.setXpath("//dr:aggregatorInstitution");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("repositoryName");
		field.setXpath("//dr:repositoryName");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("repositoryLink");
		field.setXpath("//dr:repositoryLink");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("repositoryCountry");
		field.setXpath("//dr:repositoryCountry");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("repositoryInstitution");
		field.setXpath("//dr:repositoryInstitution");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("creator");
		field.setXpath("//dc:creator");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("title");
		field.setXpath("//dc:title");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("subject");
		field.setXpath("//dc:subject");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("CobjCategory");
		field.setXpath("//dr:CobjCategory");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("language");
		field.setXpath("//dc:language");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("dateAccepted");
		field.setXpath("//dc:dateAccepted");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("identifier");
		field.setXpath("//dc:identifier");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("publisher");
		field.setXpath("//dc:publisher");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("source");
		field.setXpath("//dc:source");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("contributor");
		field.setXpath("//dc:contributor");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("relation");
		field.setXpath("//dc:relation");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		field.setTokenizable(false);
		layouts.add(field);
		field = new LayoutField();
		field.setName("description");
		field.setXpath("//dc:description");
		field.setIndexable(true);
		field.setResult(true);
		field.setStat(false);
		layouts.add(field);
		field = new LayoutField();

		return layout;
	}
*/
	private synchronized void updateLists(IndexLayout layout) {
		for (LayoutField l : layout.getLayoutFields()) {
			if (l.isIndexable()) {
				indexableFields.add(l);
			}
			if (l.isResult()) {
				resultFields.add(l);
			}
			if (l.isStat()) {
				statFields.add(l);
			}
			if (l.isTokenizable()) {
				tokenizableFields.add(l);
			}
		}
		// do we need sorting?
	}

	public List<LayoutField> getIndexableFields() {
		return indexableFields;
	}

	public List<LayoutField> getResultFields() {
		return resultFields;
	}

	public List<LayoutField> getStatFields() {
		return statFields;
	}

	public List<LayoutField> getTokenizableFields() {
		return tokenizableFields;
	}
}

