/**
 * 
 */
package com.ejie.ad74a.dao.iml;

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

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.stereotype.Repository;

import com.ejie.ad74a.dao.PisoTuteladoDao;
import com.ejie.ad74a.model.PisoTuteladoSolicitante;

/**
 * Implementacion para persistencia de pisos tutelados
 * @author BICUGUAL
 *
 */
@Repository
public class PisoTuteladoDaoImpl implements PisoTuteladoDao {

	JdbcTemplate jdbcTemplate;
	
	public static final String T_PISOS_TUTELADOS = "AD74A.AD74A32T00";
	public static final String T_PISOS_TUTE_SOLI = "AD74A.AD74A32T01";
	
	
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	
	
	@Override
	public List<PisoTuteladoSolicitante> findPisoTuteladoSolicitanteByIdPisoTuteladoAndIdSolicitanteAndMensualidad(Long idPisoTutelado, Long idSolicitante, Date fInicioMensualidad, Date fFinMensualidad){
		String sql = 
		"SELECT ps.ID_PISO_SOLICITANTE_32, "
			+ "ps.ID_PISO_32, "
			+ "ps.ID_SOLICITANTE_32, "
			+ "ps.F_DESDE_32, "
			+ "ps.F_HASTA_32 "
		+ "FROM " + T_PISOS_TUTE_SOLI + " ps "
		+ "WHERE ps.ID_PISO_32 = :idPisoTutelado  "
			+ "AND ps.ID_SOLICITANTE_32 = :idSolicitante "
			+ "AND ps.F_DESDE_32 <= :fFinMensualidad "
			+ "AND (ps.F_HASTA_32 IS NULL OR ps.F_HASTA_32 > :fInicioMensualidad) "
		+ "ORDER BY ps.F_DESDE_32";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("idPisoTutelado", idPisoTutelado)
				.addValue("idSolicitante", idSolicitante)
				.addValue("fInicioMensualidad", fInicioMensualidad)
				.addValue("fFinMensualidad", fFinMensualidad);
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		
		return namedParameterJdbcTemplate.query(sql, parameters, new PisoTuteladoSolicitanteMapper());
	}
	
	@Override
	public List<PisoTuteladoSolicitante> findPisoTuteladoSolicitanteByIdSolicitanteAndMensualidad(Long idSolicitante, Date fInicioMensualidad, Date fFinMensualidad){
		String sql = 
		"SELECT ps.ID_PISO_SOLICITANTE_32, "
			+ "ps.ID_PISO_32, "
			+ "ps.ID_SOLICITANTE_32, "
			+ "ps.F_DESDE_32, "
			+ "ps.F_HASTA_32 "
		+ "FROM " + T_PISOS_TUTE_SOLI + " ps "
		+ "WHERE ps.ID_SOLICITANTE_32 = :idSolicitante "
			+ "AND ps.F_DESDE_32 <= :fFinMensualidad "
			+ "AND (ps.F_HASTA_32 IS NULL OR ps.F_HASTA_32 > :fInicioMensualidad) "
		+ "ORDER BY ps.F_DESDE_32";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("idSolicitante", idSolicitante)
				.addValue("fInicioMensualidad", fInicioMensualidad)
				.addValue("fFinMensualidad", fFinMensualidad);
		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		
		return namedParameterJdbcTemplate.query(sql, parameters, new PisoTuteladoSolicitanteMapper());
	}
	
	/**
	 * Mapper para entidad PisoTuteladoSolicitante
	 * @author BICUGUAL
	 *
	 */
	private class PisoTuteladoSolicitanteMapper implements RowMapper<PisoTuteladoSolicitante> {
		
		public PisoTuteladoSolicitante mapRow(ResultSet rs, int rowNum) throws SQLException {
			
			PisoTuteladoSolicitante item = new PisoTuteladoSolicitante();
			item.setIdPisoSolicitante(rs.getLong("ID_PISO_SOLICITANTE_32"));
			item.setIdPisoTutelado(rs.getLong("ID_PISO_32"));
			item.setIdSolicitante(rs.getLong("ID_SOLICITANTE_32"));
			item.setfDesde(null != rs.getDate("F_DESDE_32") ? rs.getDate("F_DESDE_32").toLocalDate() : null);
			item.setfHasta(null != rs.getDate("F_HASTA_32") ? rs.getDate("F_HASTA_32").toLocalDate() : null);
			
			return item;
		}
	}
}
