package eu.dnetlib.goldoa.service.utils;

import eu.dnetlib.goldoa.domain.ManagerException;
import eu.dnetlib.goldoa.domain.Publication;
import eu.dnetlib.goldoa.domain.Request;
import eu.dnetlib.goldoa.domain.stats.Tuple;
import eu.dnetlib.goldoa.service.PublicationManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;

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

/**
 * Created by antleb on 3/7/16.
 */
public class LicenseUpdateTask implements Runnable {

	private static final String GET_MISSING_LICENSES = "select pub.id, pub.doi from publication pub join request r on r.publication=pub.id where doi is not null and license is null and r.status=" + Request.RequestStatus.ACCOUNTING_PAID.getCode();
	private static final String UPDATE_LICENSE = "update publication set license=? where id=?";

	private DataSource dataSource;
	private PublicationManager publicationManager;

	public LicenseUpdateTask(DataSource dataSource, PublicationManager publicationManager) {
		this.dataSource = dataSource;
		this.publicationManager = publicationManager;
	}

	@Override
	public void run() {
		System.out.println("Updating paid request licenses!");

		JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

		List<Tuple<String, String>> pubs = jdbcTemplate.query(GET_MISSING_LICENSES, new RowMapper<Tuple<String, String>>() {
			@Override
			public Tuple<String, String> mapRow(ResultSet rs, int rowNum) throws SQLException {
				return new Tuple<String, String>(rs.getString("id"), rs.getString("doi"));
			}
		});

		for (Tuple<String, String> pub:pubs) {
			try {
				Publication publication = publicationManager.resolveDOI(pub.getSecond());

				if (publication.getLicense() != null) {
					jdbcTemplate.update(UPDATE_LICENSE, new String[] {publication.getLicense(), pub.getFirst()}, new int[] {Types.VARCHAR, Types.VARCHAR});
				}
			} catch (ManagerException e) {
				System.out.print("Error updating license " + e.getErrorCause());
			} catch (Exception e) {
				System.out.print("Error updating license " + e.getMessage());
			}
		}
	}
}
