package gr.uoa.di.webui.search;

import eu.dnetlib.api.data.PublisherService;
import eu.dnetlib.api.data.SearchServiceException;
import eu.dnetlib.domain.data.Document;
import gr.uoa.di.driver.util.ServiceLocator;
import gr.uoa.di.driver.web.ep.EPManager;
import gr.uoa.di.driver.web.ep.EPManagerException;
import gr.uoa.di.driver.web.ep.domain.Node;

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

import org.apache.log4j.Logger;

public class DocumentProvider {
	
	private EPManager epManager = null;
	private DocumentReader documentReader = null;
	private ServiceLocator<PublisherService> publisherServiceLocator = null;
	
	private Logger logger = Logger.getLogger(DocumentProvider.class);
	
	public Document provideDocument(String id) throws SearchServiceException {
		PublisherService publisher = getPublisherServiceLocator().getService();
		
		try {
			String xmlDoc = publisher.getResourceById(id, "DMF");
			
			logger.debug("xml: " + xmlDoc);
	
			if (xmlDoc != null) {
				Document doc = getDocumentReader().read(xmlDoc);
				if (!doc.getFieldValues("CobjTypology").get(0).toLowerCase().equals("textual")) {
					logger.debug("Found indexed compound object " + id);
					logger.debug("Updating indexed compound object from dlms " + id);
					//TODO: uncomment went dlms is ready!
//					try {
//						doc = epManager.getEnhachedPublication(id);
//					} catch (EPManagerException epme) {
//						logger.warn("Indexed compound object " + id + " not found in dlms. Keep" +
//								"description from index", epme);
//					}
				}
				
				if(!doc.getMap().isEmpty()) {
					return doc;
				}
				
			} else { 
				logger.warn("Document " + id + " not found in publisher");
				logger.debug("Contacting dlms for document with id " + id);
				try {
					Node node = epManager.getNode(id);
					Document document = node.getDocument();
					if(document!= null && !document.getMap().isEmpty()) {
						return document;
					}
					
				} catch (EPManagerException epme) {
					logger.warn("Document  id " + id + " not found in publisher", epme);
				}
				
			}
		} catch (Exception t) {
			throw new SearchServiceException("Cannot retrieve document with id: " + id, t);
		}
		
		return null;
	}

	public List<Document> provideDocuments(List<String> ids) throws SearchServiceException {
		logger.debug("Getting documents");

		List<Document> documents = new ArrayList<Document>();
		
		for (String id : ids) {
			documents.add(this.provideDocument(id));
		}
		
		logger.debug("Returning documents " + documents.size());
		
		if (logger.isDebugEnabled()) {
			for(Document d:documents) {
				logger.debug("Returning d " + d.getMap());
			}
		}
		
		return documents;
	}
	
	public EPManager getEpManager() {
		return epManager;
	}

	public void setEpManager(EPManager epManager) {
		this.epManager = epManager;
	}

	public void setPublisherServiceLocator(ServiceLocator<PublisherService> publisherServiceLocator) {
		this.publisherServiceLocator = publisherServiceLocator;
	}

	public ServiceLocator<PublisherService> getPublisherServiceLocator() {
		return publisherServiceLocator;
	}

	public void setDocumentReader(DocumentReader documentReader) {
		this.documentReader = documentReader;
	}

	public DocumentReader getDocumentReader() {
		return documentReader;
	}

}
