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.Locale;
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 LocaleVocabularyMap searchVocabularyMap = new LocaleVocabularyMap();
	private LocaleVocabularyMap resultVocabularyMap = new LocaleVocabularyMap();
	private LocaleVocabularyMap browseVocabularyMap = new LocaleVocabularyMap();
	private LocaleVocabularyMap documentFieldVocabularyMap = new LocaleVocabularyMap();
	private VocabularyLoader vocabularyLoader = null;

	public void init() {
		Map<String, String> searchVocabularies = webLayoutManager
				.getSearchVocabularies();
		Map<String, String> browseVocabularies = webLayoutManager
				.getBrowseVocabularies();
		Map<String, String> documentFieldVocabularies = webLayoutManager
				.getDocumentFieldVocabularies();
		
		logger.debug("SUPPORTED LOCALES " + webLayoutManager.getLayout().getSupportedLocales());

		for (String fieldname : searchVocabularies.keySet()) {
			try {
				searchVocabularyMap.addVocabulary(fieldname, Locale.ROOT, 
						getVocabulary(searchVocabularies.get(fieldname)));
			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + searchVocabularies.get(fieldname), jaxbe);
				
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + searchVocabularies.get(fieldname), e);

			} catch (IllegalArgumentException iae) {
				logger.warn("Error loading vocabulary " + searchVocabularies.get(fieldname));
			}
				
			for (Locale locale : webLayoutManager.getLayout().getSupportedLocales()) {					
				try {
					searchVocabularyMap.addVocabulary(fieldname, locale,
							getVocabulary(searchVocabularies.get(fieldname)+ "_" + locale));
				
				} catch (JAXBException jaxbe) {
					logger.error("Error loading vocabulary " + searchVocabularies.get(fieldname), jaxbe);
					
				} catch (ISLookUpException e) {
					logger.error("Error loading vocabulary " + searchVocabularies.get(fieldname), e);

				} catch (IllegalArgumentException iae) {
					logger.warn("Error loading vocabulary " + searchVocabularies.get(fieldname));
				}
			}

		}

		for (String fieldname : browseVocabularies.keySet()) {

			try {
				browseVocabularyMap.addVocabulary(fieldname, Locale.ROOT,
					getVocabulary(browseVocabularies.get(fieldname)));
				resultVocabularyMap.addVocabulary(fieldname, Locale.ROOT,
					getVocabulary(browseVocabularies.get(fieldname)));
				
			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), jaxbe);
				
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), e);

			} catch (IllegalArgumentException iae) {
				logger.warn("Error loading vocabulary " + browseVocabularies.get(fieldname));
			}
			
			for (Locale locale : webLayoutManager.getLayout().getSupportedLocales()) {

				try {
					browseVocabularyMap.addVocabulary(fieldname, locale,
						getVocabulary(browseVocabularies.get(fieldname) + "_" + locale));
					resultVocabularyMap.addVocabulary(fieldname, locale,
							getVocabulary(browseVocabularies.get(fieldname) + "_" + locale));
					
				} catch (JAXBException jaxbe) {
					logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), jaxbe);
					
				} catch (ISLookUpException e) {
					logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), e);
					
				} catch (IllegalArgumentException iae) {
					logger.warn("Error loading vocabulary " + browseVocabularies.get(fieldname));
				}
			}

		}

		for (String fieldname : documentFieldVocabularies.keySet()) {
			try {
				documentFieldVocabularyMap.addVocabulary(fieldname, Locale.ROOT, 
					getVocabulary(documentFieldVocabularies.get(fieldname)));
				resultVocabularyMap.addVocabulary(fieldname, Locale.ROOT,
					getVocabulary(documentFieldVocabularies.get(fieldname)));

			} catch (JAXBException jaxbe) {
				logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), jaxbe);
				
			} catch (ISLookUpException e) {
				logger.error("Error loading vocabulary " + browseVocabularies.get(fieldname), e);

			} catch (IllegalArgumentException iae) {
				logger.warn("Error loading vocabulary " + browseVocabularies.get(fieldname));
			}
			
			for (Locale locale : webLayoutManager.getLayout().getSupportedLocales()) {
				try {
					documentFieldVocabularyMap.addVocabulary(fieldname, locale,
						getVocabulary(documentFieldVocabularies.get(fieldname)+ "_" + locale));
					resultVocabularyMap.addVocabulary(fieldname, locale,
							getVocabulary(documentFieldVocabularies.get(fieldname)+ "_" + locale));
				} catch (JAXBException jaxbe) {
					logger.error("Error loading vocabulary " + documentFieldVocabularies.get(fieldname), jaxbe);
					
				} catch (ISLookUpException e) {
					logger.error("Error loading vocabulary " + documentFieldVocabularies.get(fieldname), e);
					
				} catch (IllegalArgumentException iae) {
					logger.warn("Error loading vocabulary " + documentFieldVocabularies.get(fieldname));
				}						
			}
		}
	}

	public WebLayoutManager getWebLayoutManager() {
		return webLayoutManager;
	}

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

	public LocaleVocabularyMap getSearchVocabularyMap() {
		return searchVocabularyMap;
	}

	public void setSearchVocabularyMap(LocaleVocabularyMap searchVocabularyMap) {
		this.searchVocabularyMap = searchVocabularyMap;
	}

	public LocaleVocabularyMap getResultVocabularyMap() {
		return resultVocabularyMap;
	}

	public void setResultVocabularyMap(LocaleVocabularyMap resultVocabularyMap) {
		this.resultVocabularyMap = resultVocabularyMap;
	}

	public LocaleVocabularyMap getBrowseVocabularyMap() {
		return browseVocabularyMap;
	}

	public void setBrowseVocabularyMap(LocaleVocabularyMap browseVocabularyMap) {
		this.browseVocabularyMap = browseVocabularyMap;
	}

	public LocaleVocabularyMap getDocumentFieldVocabularyMap() {
		return documentFieldVocabularyMap;
	}

	public void setDocumentFieldVocabularyMap(
			LocaleVocabularyMap documentFieldVocabularyMap) {
		this.documentFieldVocabularyMap = documentFieldVocabularyMap;
	}

	public VocabularyLoader getVocabularyLoader() {
		return vocabularyLoader;
	}

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

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

		return vocabularyLoader.getVocabulary(vocabularyName);
	}

}