package com.ejie.ad74a.dao.iml;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
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.jdbc.support.GeneratedKeyHolder;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.dao.SeguimientoUsuariosDao;
import com.ejie.ad74a.model.SeguimientoUsuarios;
import com.ejie.ad74a.util.UtilSQL;

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

@Repository
@Transactional
public class SeguimientoUsuariosDaoImpl implements SeguimientoUsuariosDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDSEGUIMIENTO67", "FECHASEGUIMIENTO67",
			"USUARIO67", "TOTAL67" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_SEGUIMIENTO_USUARIOS = "SEQ_SEGUIMIENTO_USUARIOS";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<SeguimientoUsuarios> rwMapSeguimientoUsuarios = new RowMapper<SeguimientoUsuarios>() {
		public SeguimientoUsuarios mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			SeguimientoUsuarios seguimientoUsuarios = new SeguimientoUsuarios();
			seguimientoUsuarios.setFechaSeguimiento67(resultSet.getDate("FECHA"));
			seguimientoUsuarios.setUsuario67(resultSet.getString("USUARIO"));
			seguimientoUsuarios.setTotal67(UtilSQL.getInt(resultSet, "TOTAL"));

			return seguimientoUsuarios;
		}
	};

	/**
	 * 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 estudios finalizados por usuario/día para el día de actual
	 * 
	 * @return List<SeguimientoUsuarios>
	 * 
	 */	 
	@Transactional(readOnly = true)
	public List<SeguimientoUsuarios> obtenerEstudiosFinalizadosUsuarioDia(Date fInicio, Date fFin) throws Exception {
		StringBuilder query = new StringBuilder();
		
//		query.append("SELECT DISTINCT(USUARIO_66) USUARIO, COUNT(ID_HISTORICO_66) TOTAL, TO_DATE(TO_CHAR(FECHA_HISTORICO_66, 'MM/DD/YYYY'), 'MM/DD/YYYY') FECHA "); 
//		query.append(" FROM AD74A66T00 "); 
//		query.append(" WHERE TO_CHAR(FECHA_HISTORICO_66, 'MM/DD/YYYY')=TO_CHAR(SYSDATE, 'MM/DD/YYYY') ");
//		query.append(" GROUP BY USUARIO_66, TO_CHAR(FECHA_HISTORICO_66, 'MM/DD/YYYY')");
		
		List<Object> params = new ArrayList<>();
		params.add(fInicio);
		params.add(fFin);
		query.append("SELECT DISTINCT(USUARIO_66) USUARIO, COUNT(ID_HISTORICO_66) TOTAL, TRUNC(FECHA_HISTORICO_66) FECHA ");
		query.append(" FROM AD74A66T00 ");
		query.append(" WHERE FECHA_HISTORICO_66 BETWEEN TRUNC(?) AND TRUNC(?) ");
		query.append(" GROUP BY USUARIO_66, TRUNC(FECHA_HISTORICO_66) ");
		
		return this.jdbcTemplate.query(query.toString(), this.rwMapSeguimientoUsuarios, params.toArray());
	}
	
	/**
	 * Método para insertar un registro en la tabla de seguimiento de usuarios
	 * 
	 * @param segUsuarios - SeguimientoUsuarios
	 * @return SeguimientoUsuarios
	 */
	public SeguimientoUsuarios insertarActualizarSeguimientoUsuario(SeguimientoUsuarios segUsuarios) throws Exception {
		
		// 1.- Comprobar si para el usuario/fecha ya existe registro
		StringBuilder queryFind = new StringBuilder("SELECT COUNT(1) FROM SEGUIMIENTO_USUARIOS ");
		queryFind.append(" WHERE USUARIO_67 LIKE ? AND TO_CHAR(FECHA_SEGUIMIENTO_67, 'MM/DD/YYYY')=TO_CHAR(?, 'MM/DD/YYYY')");
		
		List<Object> params = new ArrayList<>();
		params.add(segUsuarios.getUsuario67());
		params.add(segUsuarios.getFechaSeguimiento67());
		Long count = this.jdbcTemplate.queryForObject(queryFind.toString(), params.toArray(), Long.class);
		
		Long zero = 0L;
		if(count != null && zero.compareTo(count) < 0) {
			// 2.- Si existe actualizarlo
			StringBuilder queryUpdate = new StringBuilder("UPDATE SEGUIMIENTO_USUARIOS SET TOTAL_67 = ? ");
			queryUpdate.append(" WHERE USUARIO_67 = ? AND TO_CHAR(FECHA_SEGUIMIENTO_67, 'MM/DD/YYYY')=TO_CHAR(?, 'MM/DD/YYYY')");
			
			this.jdbcTemplate.update(queryUpdate.toString(), segUsuarios.getTotal67(), segUsuarios.getUsuario67(), segUsuarios.getFechaSeguimiento67());
		}else {			
			// 3.- Si no existe insertarlo
			GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
			
			StringBuilder queryAdd = new StringBuilder("INSERT INTO SEGUIMIENTO_USUARIOS (ID_SEGUIMIENTO_67, FECHA_SEGUIMIENTO_67, USUARIO_67, TOTAL_67) ");
			queryAdd.append(" VALUES(").append(SEQUENCE_SEGUIMIENTO_USUARIOS).append(".NEXTVAL, :fecha,:usuario,:total)");
			
			MapSqlParameterSource parameters = new MapSqlParameterSource()
					.addValue("fecha", segUsuarios.getFechaSeguimiento67())//
					.addValue("usuario", segUsuarios.getUsuario67()) //
					.addValue("total", segUsuarios.getTotal67());
			
			NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
			namedParameterJdbcTemplate.update(queryAdd.toString(), parameters, generatedKeyHolder, new String[] { "ID_SEGUIMIENTO_67" });
			segUsuarios.setIdSeguimiento67(generatedKeyHolder.getKey().longValue());
		}
		

		return segUsuarios;
	}
}
