package eu.dnetlib.goldoa.service;

import eu.dnetlib.goldoa.domain.Journal;
import eu.dnetlib.goldoa.domain.Vocabulary;
import eu.dnetlib.goldoa.service.dao.JournalDAO;
import eu.dnetlib.goldoa.service.dao.PublisherDAO;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.transaction.annotation.Transactional;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.List;

/**
 * Created by antleb on 3/11/15.
 */
@Transactional
public class JournalManagerImpl implements JournalManager {

    @Autowired
    private JournalDAO journalDAO;
    @Autowired
    private PublisherDAO publisherDAO;

    @Override
    public List<Vocabulary> search(String term) {
        return journalDAO.search(term);
    }

    @Override
    public Journal getJournal(String journalId) {
        Journal journal = journalDAO.getJournal(journalId);

        if (journal.getPublisher() != null)
            journal.setPublisher(publisherDAO.getPublisher(journal.getPublisher().getId()));

        return journal;
    }

    @Override
    public Journal getJournalByTitle(String title) {
        try {
            Journal journal = journalDAO.getJournalByTitle(title);

            if (journal.getPublisher() != null)
                journal.setPublisher(publisherDAO.getPublisher(journal.getPublisher().getId()));

            return journal;
        } catch (EmptyResultDataAccessException e) {

        }

        return null;
    }

    @Override
    public Journal saveJournal(Journal journal) {
        if (journal.getId() == null) {
            journal.setId("portal::" + DigestUtils.md5Hex(journal.getTitle()));
            journal.setSource("portal");
        }

        return journalDAO.saveJournal(journal);
    }

    public JournalDAO getJournalDAO() {
        return journalDAO;
    }

    public void setJournalDAO(JournalDAO journalDAO) {
        this.journalDAO = journalDAO;
    }

    public PublisherDAO getPublisherDAO() {
        return publisherDAO;
    }

    public void setPublisherDAO(PublisherDAO publisherDAO) {
        this.publisherDAO = publisherDAO;
    }
}
