package com.ejie.ad74a.dao.iml;

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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.support.DataAccessUtils;
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.DiscapacidadDao;
import com.ejie.ad74a.model.Discapacidad;
import com.ejie.ad74a.util.Ad74aDataBaseAudit;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.x38.dto.JerarquiaDto;

/**
 * DiscapacidadDaoImpl generated by UDA, 01-jun-2023 10:30:03.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class DiscapacidadDaoImpl implements DiscapacidadDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDDISCAPACIDAD71", "DESCDISCAPACIDAD71",
			"IDEXPEDIENTE71", "IDSOLICITANTE71", "DISCAPACIDADFISICA71", "DISCAPACIDADINTELECTO71",
			"DISCAPACIDADSENSORIAL71", "FRESOLUCION71", "USUHISTORICO71", "FHISTORICO71", "USUALTA71", "FALTA71" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_DISCAPACIDAD = "SEQ_DISCAPACIDAD";
	
	private static final Logger logger = LoggerFactory.getLogger(DiscapacidadDaoImpl.class);

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Discapacidad> rwMap = new RowMapper<Discapacidad>() {
		public Discapacidad mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Discapacidad(UtilSQL.getLong(resultSet, "IDDISCAPACIDAD71"),
					resultSet.getString("DESCDISCAPACIDAD71"), UtilSQL.getLong(resultSet, "IDEXPEDIENTE71"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE71"), UtilSQL.getInt(resultSet, "DISCAPACIDADFISICA71"),
					UtilSQL.getInt(resultSet, "DISCAPACIDADINTELECTO71"),
					UtilSQL.getInt(resultSet, "DISCAPACIDADSENSORIAL71"), resultSet.getDate("FRESOLUCION71"),
					resultSet.getString("USUHISTORICO71"), resultSet.getDate("FHISTORICO71"),
					resultSet.getString("USUALTA71"), resultSet.getDate("FALTA71"));
		}
	};
	
	/**
	 * Rowmapper para Jerarquía
	 *
	 * @param dataSource DataSource
	 * @return
	 */
	private RowMapper<JerarquiaDto<Discapacidad>> rwMapJerarquia = new RowMapper<JerarquiaDto<Discapacidad>>() {
		public JerarquiaDto<Discapacidad> mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Discapacidad discapacidad = new Discapacidad(UtilSQL.getLong(resultSet, "IDDISCAPACIDAD71"),
					resultSet.getString("DESCDISCAPACIDAD71"), UtilSQL.getLong(resultSet, "IDEXPEDIENTE71"),
					UtilSQL.getLong(resultSet, "IDSOLICITANTE71"), UtilSQL.getInt(resultSet, "DISCAPACIDADFISICA71"),
					UtilSQL.getInt(resultSet, "DISCAPACIDADINTELECTO71"),
					UtilSQL.getInt(resultSet, "DISCAPACIDADSENSORIAL71"), resultSet.getDate("FRESOLUCION71"),
					resultSet.getString("USUHISTORICO71"), resultSet.getDate("FHISTORICO71"),
					resultSet.getString("USUALTA71"), resultSet.getDate("FALTA71"));

			JerarquiaDto<Discapacidad> jerarquia = new JerarquiaDto<Discapacidad>();
			jerarquia.setModel(discapacidad);
			jerarquia.setLevel(resultSet.getBigDecimal("LEVEL").intValue());
			jerarquia.setParentNodes(resultSet.getString("PARENTNODES"));
			jerarquia.setIsLeaf(Boolean.parseBoolean(resultSet.getString("ISLEAF")));
			jerarquia.setFilter(Boolean.parseBoolean(resultSet.getString("FILTER")));
			return jerarquia;
		}
	};

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

	/*
	 * OPERACIONES CRUD
	 */

	
	/**
	 * Inserts a single row in the Discapacidad table.
	 *
	 * @param discapacidad Discapacidad
	 * @return Discapacidad
	 */
	public Discapacidad add(Discapacidad discapacidad, Boolean modoPrueba) {
		
		if(Boolean.FALSE.equals(modoPrueba)) {
			try {
				Ad74aDataBaseAudit.identificarUsuarioAuditor(jdbcTemplate);
			} catch (Exception e) {
	
			}
		
			GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
	
			String query = "INSERT INTO DISCAPACIDAD (ID_DISCAPACIDAD_71, DESC_DISCAPACIDAD_71, ID_EXPEDIENTE_71, ID_SOLICITANTE_71, DISCAPACIDAD_FISICA_71, DISCAPACIDAD_INTELECTO_71, DISCAPACIDAD_SENSORIAL_71, F_RESOLUCION_71, USU_HISTORICO_71, F_HISTORICO_71, USU_ALTA_71, F_ALTA_71) "
					+ "VALUES (" + SEQUENCE_DISCAPACIDAD
					+ ".NEXTVAL,:descDiscacidad,:idExpediente,:idSolicitante,:discFisica,:discInt,:discSensorial,:fResol,:usuHist,:fHist,:usuAlta,sysdate)";
		
			MapSqlParameterSource parameters = new MapSqlParameterSource()
					.addValue("descDiscacidad", discapacidad.getDescDiscapacidad71())
					.addValue("idExpediente", discapacidad.getIdExpediente71())
					.addValue("idSolicitante", discapacidad.getIdSolicitante71())
					.addValue("discFisica", discapacidad.getDiscapacidadFisica71())
					.addValue("discInt", discapacidad.getDiscapacidadIntelecto71())
					.addValue("discSensorial", discapacidad.getDiscapacidadSensorial71())
					.addValue("fResol", discapacidad.getfResolucion71())
					.addValue("usuHist", discapacidad.getUsuHistorico71()).addValue("fHist", discapacidad.getfHistorico71())
					.addValue("usuAlta", discapacidad.getUsuAlta71());
	
		
			NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
			namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_DISCAPACIDAD_71" });
			discapacidad.setIdDiscapacidad71(generatedKeyHolder.getKey().longValue());
		
			try {
				Ad74aDataBaseAudit.terminarUsuarioAuditor(jdbcTemplate);
			} catch (Exception e) {
	
			}
		}else {
			DiscapacidadDaoImpl.logger.info("Add Discapacidad MODO PRUEBA : INSERT INTO DISCAPACIDAD (ID_DISCAPACIDAD_71, DESC_DISCAPACIDAD_71, ID_EXPEDIENTE_71, ID_SOLICITANTE_71, DISCAPACIDAD_FISICA_71, DISCAPACIDAD_INTELECTO_71, DISCAPACIDAD_SENSORIAL_71, F_RESOLUCION_71, USU_HISTORICO_71, F_HISTORICO_71, USU_ALTA_71, F_ALTA_71) SEQUENCE_DISCAPACIDAD.NEXTVAL,{},{},{},{},{},{},{},{},{},sysdate)" ,discapacidad.getDescDiscapacidad71(), discapacidad.getIdExpediente71(),discapacidad.getIdSolicitante71(),discapacidad.getDiscapacidadFisica71(), discapacidad.getDiscapacidadIntelecto71(),discapacidad.getDiscapacidadSensorial71(), discapacidad.getfResolucion71(), discapacidad.getUsuHistorico71(), discapacidad.getfHistorico71(),discapacidad.getUsuAlta71());
		}
		
		return discapacidad;
	}

	/**
	 * Updates a single row in the Discapacidad table.
	 *
	 * @param discapacidad Discapacidad
	 * @return Discapacidad
	 */
	public Discapacidad pasarHistorico(Discapacidad discapacidad, String usuHistorico, Boolean modoPrueba) {

		try {
			Ad74aDataBaseAudit.identificarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}
		if(Boolean.FALSE.equals(modoPrueba)) {
			DiscapacidadDaoImpl.logger.info("pasarHistorico Discapacidad: UPDATE DISCAPACIDAD SET USU_HISTORICO_71={}, F_HISTORICO_71=sysdate  WHERE ID_DISCAPACIDAD_71={} ",usuHistorico, discapacidad.getIdDiscapacidad71()  );
			String query = "UPDATE DISCAPACIDAD SET USU_HISTORICO_71=?, F_HISTORICO_71=sysdate  WHERE ID_DISCAPACIDAD_71=?";
			this.jdbcTemplate.update(query, usuHistorico, discapacidad.getIdDiscapacidad71() );
		}else {
			DiscapacidadDaoImpl.logger.info("pasarHistorico Discapacidad MODO PRUEBA : UPDATE DISCAPACIDAD SET USU_HISTORICO_71={}, F_HISTORICO_71=sysdate  WHERE ID_DISCAPACIDAD_71={} ",usuHistorico, discapacidad.getIdDiscapacidad71()  );
		}
		try {
			Ad74aDataBaseAudit.terminarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}
		return discapacidad;
	}

	@Override
	public Discapacidad findByIdSol(Discapacidad discFilter) {
		try {
			Ad74aDataBaseAudit.identificarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}

		String query = "SELECT t1.ID_DISCAPACIDAD_71 IDDISCAPACIDAD71, t1.DISCAPACIDAD_SENSORIAL_71 DISCAPACIDADSENSORIAL71, t1.DISCAPACIDAD_FISICA_71 DISCAPACIDADFISICA71, t1.ID_EXPEDIENTE_71 IDEXPEDIENTE71, t1.ID_SOLICITANTE_71 IDSOLICITANTE71, t1.F_RESOLUCION_71 FRESOLUCION71, t1.USU_HISTORICO_71 USUHISTORICO71, t1.F_HISTORICO_71 FHISTORICO71, t1.USU_ALTA_71 USUALTA71, t1.F_ALTA_71 FALTA71 , t1.DISCAPACIDAD_INTELECTO_71 DISCAPACIDADINTELECTO71  FROM DISCAPACIDAD t1  WHERE t1.ID_SOLICITANTE_71 = ? AND F_HISTORICO_71 IS NULL";

		List<Discapacidad> discapacidadList = this.jdbcTemplate.query(query, this.rwMap, discFilter.getIdSolicitante71());
		if (discapacidadList.size() == 0) {
			return null;
		}

		Discapacidad result = (Discapacidad) DataAccessUtils.uniqueResult(discapacidadList);

		try {
			Ad74aDataBaseAudit.terminarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}
		return result;
	}
}