package gr.uoa.di.webui.search;

import eu.dnetlib.domain.enabling.Vocabulary;
import eu.dnetlib.functionality.webInterface.app.WebLayoutManager;
import gr.uoa.di.driver.enabling.ISLookUpException;
import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader;

import java.util.HashMap;
import java.util.Map;

import javax.xml.bind.JAXBException;

import org.apache.log4j.Logger;

public class VocabularyManager {

	private Logger logger = Logger.getLogger(VocabularyManager.class);
	
	private WebLayoutManager webLayoutManager = null;
	private Map<String, Vocabulary> searchVocabularyMap = new HashMap<String, Vocabulary>();
	private Map<String, Vocabulary> resultVocabularyMap = new HashMap<String, Vocabulary>();
	private Map<String, Vocabulary> browseVocabularyMap = new HashMap<String, Vocabulary>();
	private Map<String, Vocabulary> documentFieldVocabularyMap = new HashMap<String, Vocabulary>();
	private VocabularyLoader vocabularyLoader = null;

	public void init() {
		for(String vocabularyName:webLayoutManager.getSearchVocabularyNames()){
			try {
				searchVocabularyMap.put(vocabularyName, this.getVocabulary(vocabularyName));
			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + vocabularyName , jaxbe);
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + vocabularyName , e);
			}
		}
		
		for(String vocabularyName:webLayoutManager.getBrowseVocabularyNames()){
			try {
				browseVocabularyMap.put(vocabularyName, this.getVocabulary(vocabularyName));
				resultVocabularyMap.put(vocabularyName, this.getVocabulary(vocabularyName));
			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + vocabularyName , jaxbe);
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + vocabularyName , e);
			}
		}
		
		for(String vocabularyName:webLayoutManager.getDocumentFieldVocabularyNames()){
			try {
				documentFieldVocabularyMap.put(vocabularyName, this.getVocabulary(vocabularyName));
				resultVocabularyMap.put(vocabularyName, this.getVocabulary(vocabularyName));
			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + vocabularyName , jaxbe);
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + vocabularyName , e);
			}
		}
	}

	public Map<String, Vocabulary> getResultVocabularyMap() {
		return resultVocabularyMap;
	}

	public Vocabulary getVocabulary(String vocabularyName)
			throws JAXBException, ISLookUpException {

		return vocabularyLoader.getVocabulary(vocabularyName);
	}

	public void setWebLayoutManager(WebLayoutManager webLayoutManager) {
		this.webLayoutManager = webLayoutManager;
	}
	
	public void setVocabularyLoader(VocabularyLoader vocabularyLoader) {
		this.vocabularyLoader = vocabularyLoader;
	}

	public Map<String, Vocabulary> getSearchVocabularyMap() {
		return searchVocabularyMap;
	}

	public Map<String, Vocabulary> getBrowseVocabularyMap() {
		return browseVocabularyMap;
	}

	public Map<String, Vocabulary> getDocumentFieldVocabularyMap() {
		return documentFieldVocabularyMap;
	}
}
