package eu.dnetlib.data.claims.handler;

import eu.dnetlib.data.claims.entity.Result;
import eu.dnetlib.data.claims.parser.OafParser;
import eu.dnetlib.data.claims.parser.OpenAIRERecordParser;
import eu.dnetlib.data.claims.utils.ClaimUtils;
import eu.dnetlib.data.claims.utils.SearchUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

/**
 * Created by kiatrop on 8/2/2016.
 */
public class IndexResultHandler {

    SearchUtils searchUtils;
    OpenAIRERecordParser openAIRERecordParser = null;

    private Logger log = LogManager.getLogger(this.getClass());
    public Result fetchResultById(String id, String type) throws Exception {
        return openAIRERecordParser.parse2Result(searchUtils.fetchResultById(id, type));
    }
    private String fetchPublicationResult(String id) throws Exception {
        return searchUtils.fetchPublicationXmlFromIndex(id);
    }
    private String fetchSoftwareResult(String id) throws Exception {
        return  searchUtils.fetchSoftwareXmlFromIndex(id);
    }
    private String fetchOtherResult(String id) throws Exception {
        return  searchUtils.fetchOtherXmlFromIndex(id);
    }

    private String fetchDatasetResult(String id) throws Exception {
        if(searchUtils == null ){
            log.debug("searchUtils is null");
        }
        if(id == null ){
            log.debug("id is null");
        }
        return searchUtils.fetchDatasetXmlFromIndex(id);
    }
    /**
     *Searches for both publications and datasets
     * @param id
     * @return Result or null
     * @throws Exception
     */
    public Result fetchResultById(String id) throws Exception {

        String oaf = fetchPublicationResult(id);

        if (oaf == null) {
            oaf = fetchDatasetResult(id);
        }

        if (oaf == null) {
            return null;
        }

        return OafParser.oaf2Result(oaf);
    }
    public Result fetchPublicationById(String id) throws Exception {

        String oaf = fetchPublicationResult(id);

        if (oaf == null) {
            return null;
        }

        return OafParser.oaf2Result(oaf);
    }
    public Result fetchDatasetById(String id) throws Exception {

        String oaf = fetchDatasetResult(id);
        if (oaf == null) {
            return null;
        }

        return OafParser.oaf2Result(oaf);
    }
    public Result fetchSoftwareById(String id) throws Exception {

        String oaf = fetchSoftwareResult(id);
        if (oaf == null) {
            return null;
        }
        return OafParser.oaf2Result(oaf);
    }
    public Result fetchOtherById(String id) throws Exception {

        String oaf = fetchOtherResult(id);
        if (oaf == null) {
            return null;
        }
        return OafParser.oaf2Result(oaf);
    }
    public void updateOpenAIREIdPrefix(Result result) {
        result.setOpenaireId("userclaim___::" + result.getOpenaireId().split("::")[1]);
    }

    public SearchUtils getSearchUtils() {
        return searchUtils;
    }

    public void setSearchUtils(SearchUtils searchUtils) {
        this.searchUtils = searchUtils;
    }

    public OpenAIRERecordParser getOpenAIRERecordParser() {
        return openAIRERecordParser;
    }

    public void setOpenAIRERecordParser(OpenAIRERecordParser openAIRERecordParser) {
        this.openAIRERecordParser = openAIRERecordParser;
    }
}
