package com.ejie.m62fb.dao.registroVPP;

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

import javax.annotation.Resource;
import javax.sql.DataSource;
import javax.sql.rowset.serial.SerialBlob;

import org.springframework.dao.support.DataAccessUtils;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.AbstractLobCreatingPreparedStatementCallback;
import org.springframework.jdbc.support.lob.DefaultLobHandler;
import org.springframework.jdbc.support.lob.LobCreator;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.m62fb.model.AcuerdoVivienda;
import com.ejie.m62fb.model.documento.DocumentoAcuerdoReserva;
import com.ejie.m62fb.utils.sql.UtilsResulSet;

/**
 * DocumentoAcuerdoReservaDaoImpl
 * 
XXXX
 */

@Repository
@Transactional
public class DocumentoAcuerdoReservaDaoImpl implements
		DocumentoAcuerdoReservaDao {

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private final RowMapper<DocumentoAcuerdoReserva> rwMapDescarga = new RowMapper<DocumentoAcuerdoReserva>() {
		LobHandler lobHandler = new DefaultLobHandler();

		@Override
		public DocumentoAcuerdoReserva mapRow(ResultSet resultSet, int rowNum)
				throws SQLException {
			DocumentoAcuerdoReserva documento = new DocumentoAcuerdoReserva();
			documento.setIdDocumento(resultSet
					.getBigDecimal(DocumentoAcuerdoReservaDaoSql.PK));
			documento.setNomDocumento(resultSet.getString("NOM_DOCUMENTO"));
			documento.setFechaGeneracion(resultSet.getDate("FEH_GENERACION"));
			documento.setIdAcuerdoReserva(resultSet.getInt("ID_M62R41T0"));
			UtilsResulSet.getAbstractClass(resultSet, documento,
					DocumentosDaoSql.ALIAS);

			// CONTENIDO DEL DOCUMENTO
			byte[] blobBytes = lobHandler.getBlobAsBytes(resultSet,
					"OBJ_FICH_DOC");
			documento.setContenido(new SerialBlob(blobBytes));

			return documento;
		}

	};

	/**
	 * Method use to set the datasource.
	 * 
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	@Override
	public DocumentoAcuerdoReserva add(final DocumentoAcuerdoReserva documento) {
		LobHandler lobhandler = new DefaultLobHandler();
		this.jdbcTemplate.execute(
				DocumentoAcuerdoReservaDaoSql.SQL_INSERT_DATOS_DOCUMENTO,
				new AbstractLobCreatingPreparedStatementCallback(lobhandler) {
					@Override
					protected void setValues(PreparedStatement ps,
							LobCreator lobCreator) throws SQLException {
						int pos = 1;
						ps.setInt(pos++, documento.getIdAcuerdoReserva());
						lobCreator.setBlobAsBinaryStream(ps, pos++, documento
								.getContenido().getBinaryStream(),
								(int) documento.getContenido().length());
						ps.setString(pos++, documento.getNomDocumento());
						ps.setString(4, documento.getCodUsuarioUltimaModif());
					}
				});
		return documento;

	}

	@Override
	@Transactional(readOnly = true)
	public DocumentoAcuerdoReserva find(DocumentoAcuerdoReserva documento) {
		String query = DocumentoAcuerdoReservaDaoSql.SQL_FIND_DESCARGA;
		List<DocumentoAcuerdoReserva> documentoList = this.jdbcTemplate.query(
				query, this.rwMapDescarga, documento.getIdDocumento());
		return DataAccessUtils.uniqueResult(documentoList);
	}

	/**
	 * Recupera el documento por el acuerdo
	 * 
	 * @param acuerdoVivienda
	 *            AcuerdoVivienda
	 * @return DocumentoAcuerdoReserva
	 */
	@Override
	@Transactional(readOnly = true)
	public DocumentoAcuerdoReserva findByAcuerdo(AcuerdoVivienda acuerdoVivienda) {
		String query = DocumentoAcuerdoReservaDaoSql.SQL_FIND_DESCARGA_BY_ACUERDO;
		List<DocumentoAcuerdoReserva> documentoList = this.jdbcTemplate.query(
				query, this.rwMapDescarga, acuerdoVivienda.getIdM62r41t0());
		return DataAccessUtils.uniqueResult(documentoList);
	}
}