package org.simpleflatmapper.jdbc.spring;

import org.simpleflatmapper.jdbc.JdbcMapper;
import org.simpleflatmapper.util.CheckedConsumer;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.PreparedStatementCallback;
import org.springframework.jdbc.core.ResultSetExtractor;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;


public final class PreparedStatementCallbackImpl<T> implements PreparedStatementCallback<List<T>> {
	private final ResultSetExtractorImpl<T> resultSetExtractor;

	public PreparedStatementCallbackImpl(JdbcMapper<T> mapper) {
		this.resultSetExtractor = new ResultSetExtractorImpl<T>(mapper);
	}

	@Override
	public List<T> doInPreparedStatement(PreparedStatement ps) throws SQLException,
			DataAccessException {
		ResultSet rs = ps.executeQuery();
		try {
			return resultSetExtractor.extractData(rs);
		} finally {
			rs.close();
		}
	}


	public <H extends CheckedConsumer<T>> PreparedStatementCallback<H> newPreparedStatementCallback(final H handler) {
		return new PreparedStatementCallback<H>() {
			@Override
			public H doInPreparedStatement(
					PreparedStatement ps)
					throws SQLException, DataAccessException {
				ResultSet rs = ps.executeQuery();
				ResultSetExtractor<H> extractor = resultSetExtractor.newResultSetExtractor(handler);
				try {
					return extractor.extractData(rs);
				} finally {
					rs.close();
				}
			}
		};
	}



}