package gr.uoa.di.webui.search;

import eu.dnetlib.domain.data.BrowseData;
import eu.dnetlib.domain.enabling.Vocabulary;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Set;

public class EnhancedBrowseData {

	private Map<String, EnhancedFieldData> enhancedBrowseData = new HashMap<String, EnhancedFieldData>();

	// private static Logger logger =
	// Logger.getLogger(EnhancedBrowseData.class);

	public EnhancedBrowseData(BrowseData browseData,
			LocaleVocabularyMap vocabularyMap, Locale locale) {

		for (String field : browseData.getFields()) {
			Vocabulary vocabulary = vocabularyMap.getVocabulary(field, locale);
			int i = 0;
			for (String encoding : browseData.getFieldValues(field)) {
				EnhancedFieldRow enhancedFieldRow = new EnhancedFieldRow();
				if (vocabulary != null) {
					String englishName = vocabulary.getEnglishName(encoding);
					if (englishName == null) {
						enhancedFieldRow.setValue(encoding);
					} else {
						enhancedFieldRow.setValue(englishName);
					}
				} else {
					enhancedFieldRow.setValue(encoding);
				}
				enhancedFieldRow.setEncoding(encoding);
				enhancedFieldRow.setCount(browseData.getFieldCounts(field).get(
						i));

				EnhancedFieldData enhancedFieldData = enhancedBrowseData
						.get(field);
				if (enhancedFieldData == null) {
					enhancedBrowseData.put(field, new EnhancedFieldData());
				}
				enhancedBrowseData.get(field).getEnhancedFieldRowList().add(
						enhancedFieldRow);
				i++;
			}
		}
	}

	public EnhancedBrowseData(BrowseData browseData,
			LocaleVocabularyMap vocabularyMap, Locale locale, String prefix) {

		for (String field : browseData.getFields()) {
			Vocabulary vocabulary = vocabularyMap.getVocabulary(field, locale);
			int i = 0;
			for (String encoding : browseData.getFieldValues(field)) {
				if (vocabulary != null) {
					String englishName = vocabulary.getEnglishName(encoding);
					if (englishName == null) {
						englishName = encoding;
					}

					if (englishName.startsWith(prefix)) {
						EnhancedFieldRow enhancedFieldRow = new EnhancedFieldRow();
						enhancedFieldRow.setValue(englishName);
						enhancedFieldRow.setEncoding(encoding);
						enhancedFieldRow.setCount(browseData.getFieldCounts(
								field).get(i));

						EnhancedFieldData enhancedFieldData = enhancedBrowseData
								.get(field);
						if (enhancedFieldData == null) {
							enhancedBrowseData.put(field,
									new EnhancedFieldData());
						}
						enhancedBrowseData.get(field).getEnhancedFieldRowList()
								.add(enhancedFieldRow);
					}

				} else {
					EnhancedFieldData enhancedFieldData = enhancedBrowseData.get(field);

					EnhancedFieldRow enhancedFieldRow = new EnhancedFieldRow();
					enhancedFieldRow.setCount(browseData.getFieldCounts(field).get(i));
					enhancedFieldRow.setValue(browseData.getFieldValues(field).get(i));
					enhancedFieldRow.setEncoding(browseData.getFieldValues(field).get(i));
					
					if (enhancedFieldData == null) {
						enhancedBrowseData.put(field, new EnhancedFieldData());
					}
					enhancedBrowseData.get(field).getEnhancedFieldRowList().add(enhancedFieldRow);

				}
				i++;
			}

		}
	}

	public Map<String, EnhancedFieldData> getData() {
		return enhancedBrowseData;
	}

	public Set<String> getFields() {
		return enhancedBrowseData.keySet();
	}

	public List<String> getFieldValues(String field) {
		EnhancedFieldData efd = enhancedBrowseData.get(field.toLowerCase());
		if (efd == null) {
			return Collections.emptyList();
		} else {
			return efd.getValues();
		}
	}

	public List<String> getFieldEncodings(String field) {
		EnhancedFieldData efd = enhancedBrowseData.get(field.toLowerCase());
		if (efd == null) {
			return Collections.emptyList();
		} else {
			return efd.getEncodings();
		}
	}

	public List<Integer> getFieldCounts(String field) {
		EnhancedFieldData efd = enhancedBrowseData.get(field.toLowerCase());
		if (efd == null) {
			return Collections.emptyList();
		} else {
			return efd.getCount();
		}
	}
}
