package com.ejie.ad74a.dao.iml;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Calendar;
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.PrestadorServicioDao;
import com.ejie.ad74a.model.PrestadorServicio;
import com.ejie.ad74a.util.UtilSQL;

/**
 * PrestadorServicioDaoImpl generated by UDA, 04-oct-2023 9:20:42.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class PrestadorServicioDaoImpl implements PrestadorServicioDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDPRESTADOR73", "IDENTIFICADOR73",
			"RAZONSOCIAL73", "FINICIOSERVICIO73", "FFINSERVICIO73", "FALTA73", "USUALTA73", "FMODIF73", "USUMODIF73" };

	private JdbcTemplate jdbcTemplate;
	
	@Resource
    public void setDataSource(DataSource dataSource) {
    	this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<PrestadorServicio> rwMap = new RowMapper<PrestadorServicio>() {
		public PrestadorServicio mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new PrestadorServicio(UtilSQL.getLong(resultSet, "IDPRESTADOR73"),
					resultSet.getString("IDENTIFICADOR73"), resultSet.getString("RAZONSOCIAL73"),
					resultSet.getDate("FINICIOSERVICIO73"), resultSet.getDate("FFINSERVICIO73"),
					resultSet.getDate("FALTA73"), resultSet.getString("USUALTA73"), resultSet.getDate("FMODIF73"),
					resultSet.getString("USUMODIF73"));
		}
	};


	/**
	 * Obtener todos los prestadores de servicio entre una fecha inicio y fecha fin.
	 * 
	 * @param fechaInicio Date
	 * @return List<PrestadorServicio>
	 */
	@Transactional(readOnly = true)
	public List<PrestadorServicio> findPrestadorServicioEntreFechas(PrestadorServicio prestador) {
		
		//Calcula el día de fin de mes.
		Calendar calendar = Calendar.getInstance(); 
		calendar.setTime(prestador.getfInicioServicio73());
		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
		Date fechaFin = calendar.getTime();
		
		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_PRESTADOR_73 IDPRESTADOR73, t1.IDENTIFICADOR_73 IDENTIFICADOR73, t1.RAZON_SOCIAL_73 RAZONSOCIAL73, t1.F_INICIO_SERVICIO_73 FINICIOSERVICIO73, t1.F_FIN_SERVICIO_73 FFINSERVICIO73, t1.F_ALTA_73 FALTA73, t1.USU_ALTA_73 USUALTA73, t1.F_MODIF_73 FMODIF73, t1.USU_MODIF_73 USUMODIF73 ");
		query.append(" FROM PRESTADOR_SERVICIO t1 ");
		query.append(" WHERE TRUNC(F_INICIO_SERVICIO_73) <= ? AND (F_FIN_SERVICIO_73 IS NULL OR TRUNC(F_FIN_SERVICIO_73) >= ?)");
		
		return this.jdbcTemplate.query(query.toString(), this.rwMap, fechaFin, prestador.getfInicioServicio73());
	}
	
	/**
	 * StringBuilder initilization value
	 */
	public static final int STRING_BUILDER_INIT = 4096;
}
