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.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.dao.ValoracionesDao;
import com.ejie.ad74a.model.MaestroNivSoporte;
import com.ejie.ad74a.model.Valoraciones;
import com.ejie.ad74a.util.UtilSQL;

/**
 * ValoracionesDaoImpl generated by UDA, 21-mar-2023 11:41:04.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class ValoracionesDaoImpl implements ValoracionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDVALORACION08", "FVALORACION08",
			"TIPOVALORACION08", "CONTRATOACTUACION08", "IDNIVELSOPORTE08", "ALTORIESGO08", "NIVELMALTRATO08",
			"NIVELSUICIDIO08", "PERIODICIDADPROPUESTA08", "PERIODICIDADACORDADA08", "PROPUESTAACEPTADA08",
			"IDSOLICITANTE08", "USUHISTORICO08", "FHISTORICO08", "FALTA08", "USUALTA08", "MOTIVORETRASO08",
			"IDENTIFICADOR01", "NOMBRE01", "APELLIDO101", "APELLIDO201", "DSCPROV", "DSOMUN", "MSTRIDNIVELSOPORTE58",
			"MSTRDESCES58", "MSTRDESCEU58", "MSTRFALTA58", "MSTRUSUALTA58", "MSTRFMODIF58", "MSTRUSUMODIF58",
			"MODOVALORACION08" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_VALORACION = "SEQ_VALORACIONES";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Valoraciones> rwMapValoracionEntreFechas = new RowMapper<Valoraciones>() {
		public Valoraciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Valoraciones valoraciones = new Valoraciones(UtilSQL.getLong(resultSet, "IDVALORACION08"));
			valoraciones.setMaestroNivSoporte(new MaestroNivSoporte(UtilSQL.getLong(resultSet, "IDNIVELSOPORTE08")));
			valoraciones.setfHistorico08(resultSet.getDate("FHISTORICO08"));
			valoraciones.setfAlta08(resultSet.getDate("FALTA08"));

			return valoraciones;
		}
	};

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

	/**
	 * Metodo para obtener los niveles de soporte entre fechas.
	 * 
	 * @param fechaDesde Date
	 * @param fechaHasta Date
	 * @return List<Valoraciones>
	 */
	@Transactional(readOnly = true)
	public List<Valoraciones> findValoracionEntreFechas(Date fechaDesde, Date fechaHasta, Long idBeneficiario) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08 ");
		query.append(" FROM VALORACIONES t1 ");
		query.append(" WHERE F_ALTA_08 <= ? AND F_HISTORICO_08 >= ?");
		query.append(" AND t1.ID_NIVEL_SOPORTE_08 IS NOT NULL");
		query.append(" AND t1.id_solicitante_08 = ?");

		query.append(" UNION ");

		query.append(
				"SELECT t1.ID_VALORACION_08 IDVALORACION08, t1.ID_NIVEL_SOPORTE_08 IDNIVELSOPORTE08, t1.F_HISTORICO_08 FHISTORICO08, t1.F_ALTA_08 FALTA08 ");
		query.append(
				"FROM   solicitantes t2 INNER JOIN valoraciones t1 ON (t2.id_valoracion_01 = t1.id_valoracion_08)");
		query.append(" WHERE F_ALTA_08 <= ? AND F_HISTORICO_08 >= ?");
		query.append(" AND t1.ID_NIVEL_SOPORTE_08 IS NOT NULL");
		query.append(" AND t1.id_solicitante_08 = ?");
		return this.jdbcTemplate.query(query.toString(), this.rwMapValoracionEntreFechas, fechaDesde, fechaHasta,
				idBeneficiario, fechaDesde, fechaHasta, idBeneficiario);
	}
}
