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.WebInterfaceLayout;
import gr.uoa.di.driver.enabling.ISLookUp;

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.debug("Getting index layout with name " + this.webLayout.getName());

		// TODO Get real index layout from IS

		IndexLayout layout = generateDefaultLayout();
		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;
	}
}

