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.DependenciaDao;
import com.ejie.ad74a.model.Dependencia;
import com.ejie.ad74a.util.Ad74aDataBaseAudit;
import com.ejie.ad74a.util.UtilSQL;
import com.ejie.x38.dto.JerarquiaDto;

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

@Repository
@Transactional
public class DependenciaDaoImpl implements DependenciaDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDDEPENDENCIA04", "IDGRADODEPENDENCIA04",
			"DESCOTRADEPENDENCIA04", "IDEXPEDIENTE04", "IDSOLICITANTE04", "FRESOLUCION04", "USUHISTORICO04",
			"FHISTORICO04", "USUALTA04", "FALTA04" };

	private JdbcTemplate jdbcTemplate;

	public static final String SEQUENCE_DEPENDENCIA = "SEQ_DEPENDENCIA";
	
	private static final Logger logger = LoggerFactory.getLogger(DependenciaDaoImpl.class);

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Dependencia> rwMap = new RowMapper<Dependencia>() {
		public Dependencia mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Dependencia dependencia = new Dependencia(UtilSQL.getLong(resultSet, "IDDEPENDENCIA04"),
					UtilSQL.getLong(resultSet, "IDGRADODEPENDENCIA04"), resultSet.getString("DESCOTRADEPENDENCIA04"),
					UtilSQL.getLong(resultSet, "IDEXPEDIENTE04"), UtilSQL.getLong(resultSet, "IDSOLICITANTE04"),
					resultSet.getDate("FRESOLUCION04"), resultSet.getString("USUHISTORICO04"),
					resultSet.getDate("FHISTORICO04"), resultSet.getString("USUALTA04"), resultSet.getDate("FALTA04"),
					resultSet.getBigDecimal("BAREMO04"));
			dependencia.setDescOtraDependencia04(resultSet.getString("DESCOTRADEPENDENCIA04"));
			return dependencia;
		}
	};
	
	/**
	 * Rowmapper para Jerarquía
	 *
	 * @param dataSource DataSource
	 * @return
	 */
	private RowMapper<JerarquiaDto<Dependencia>> rwMapJerarquia = new RowMapper<JerarquiaDto<Dependencia>>() {
		public JerarquiaDto<Dependencia> mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Dependencia dependencia = new Dependencia(UtilSQL.getLong(resultSet, "IDDEPENDENCIA04"),
					UtilSQL.getLong(resultSet, "IDGRADODEPENDENCIA04"), resultSet.getString("DESCOTRADEPENDENCIA04"),
					UtilSQL.getLong(resultSet, "IDEXPEDIENTE04"), UtilSQL.getLong(resultSet, "IDSOLICITANTE04"),
					resultSet.getDate("FRESOLUCION04"), resultSet.getString("USUHISTORICO04"),
					resultSet.getDate("FHISTORICO04"), resultSet.getString("USUALTA04"), resultSet.getDate("FALTA04"),
					resultSet.getBigDecimal("BAREMO04"));

			JerarquiaDto<Dependencia> jerarquia = new JerarquiaDto<Dependencia>();
			jerarquia.setModel(dependencia);
			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 Dependencia table.
	 *
	 * @param dependencia Dependencia
	 * @return Dependencia
	 */
	public Dependencia add(Dependencia dependencia, Boolean modoPrueba) {

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

		}
		
		if(Boolean.FALSE.equals(modoPrueba)) {
			DependenciaDaoImpl.logger.info("Add Dependencia: INSERT INTO DEPENDENCIA (ID_DEPENDENCIA_04, BAREMO_04 ,ID_GRADO_DEPENDENCIA_04, DESC_OTRA_DEPENDENCIA_04, ID_EXPEDIENTE_04, ID_SOLICITANTE_04, F_RESOLUCION_04, USU_HISTORICO_04, F_HISTORICO_04, USU_ALTA_04, F_ALTA_04) SEQUENCE_DEPENDENCIA.NEXTVAL,{},{},{},{},{},{},{},{},{},sysdate)" ,dependencia.getIdGradoDependencia04(), dependencia.getBaremo04(), dependencia.getDescOtraDependencia04(), dependencia.getIdExpediente04(), dependencia.getIdSolicitante04(), dependencia.getfResolucion04(), dependencia.getUsuHistorico04(), dependencia.getfHistorico04(),dependencia.getUsuAlta04());
			GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
	
			String query = "INSERT INTO DEPENDENCIA (ID_DEPENDENCIA_04, BAREMO_04 ,ID_GRADO_DEPENDENCIA_04, DESC_OTRA_DEPENDENCIA_04, ID_EXPEDIENTE_04, ID_SOLICITANTE_04, F_RESOLUCION_04, USU_HISTORICO_04, F_HISTORICO_04, USU_ALTA_04, F_ALTA_04) "
					+ "VALUES (" + SEQUENCE_DEPENDENCIA
					+ ".NEXTVAL,:baremo,:grupo,:descOtraDepen,:idExpediente,:idSolicitante,:fResolucion,:usuHistorico,:fHistorico,:usuAlta,sysdate)";
	
			MapSqlParameterSource parameters = new MapSqlParameterSource()
					.addValue("grupo", dependencia.getIdGradoDependencia04()).addValue("baremo", dependencia.getBaremo04())
					.addValue("descOtraDepen", dependencia.getDescOtraDependencia04())
					.addValue("idExpediente", dependencia.getIdExpediente04())
					.addValue("idSolicitante", dependencia.getIdSolicitante04())
					.addValue("fResolucion", dependencia.getfResolucion04())
					.addValue("usuHistorico", dependencia.getUsuHistorico04())
					.addValue("fHistorico", dependencia.getfHistorico04()).addValue("usuAlta", dependencia.getUsuAlta04());
	
			NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
			namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_DEPENDENCIA_04" });
			dependencia.setIdDependencia04(generatedKeyHolder.getKey().longValue());
		}else {
			DependenciaDaoImpl.logger.info("Add Dependencia MODO PRUEBA : INSERT INTO DEPENDENCIA (ID_DEPENDENCIA_04, BAREMO_04 ,ID_GRADO_DEPENDENCIA_04, DESC_OTRA_DEPENDENCIA_04, ID_EXPEDIENTE_04, ID_SOLICITANTE_04, F_RESOLUCION_04, USU_HISTORICO_04, F_HISTORICO_04, USU_ALTA_04, F_ALTA_04) SEQUENCE_DEPENDENCIA.NEXTVAL,{},{},{},{},{},{},{},{},{},sysdate)" ,dependencia.getIdGradoDependencia04(), dependencia.getBaremo04(), dependencia.getDescOtraDependencia04(), dependencia.getIdExpediente04(), dependencia.getIdSolicitante04(), dependencia.getfResolucion04(), dependencia.getUsuHistorico04(), dependencia.getfHistorico04(),dependencia.getUsuAlta04());
		}
		
		try {
			Ad74aDataBaseAudit.terminarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}
		return dependencia;
	}

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

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

		}
		if(Boolean.FALSE.equals(modoPrueba)) {
			DependenciaDaoImpl.logger.info("pasarHistorico Dependencia: UPDATE DEPENDENCIA SET USU_HISTORICO_04={}, F_HISTORICO_04=sysdate  WHERE ID_DEPENDENCIA_04={} ",usuHistorico, dependencia.getIdDependencia04() );
			String query = "UPDATE DEPENDENCIA SET USU_HISTORICO_04=?, F_HISTORICO_04=sysdate  WHERE ID_DEPENDENCIA_04=?";
			this.jdbcTemplate.update(query, usuHistorico, dependencia.getIdDependencia04());
		}else {
			DependenciaDaoImpl.logger.info("pasarHistorico Dependencia MODO PRUEBA : UPDATE DEPENDENCIA SET USU_HISTORICO_04={}, F_HISTORICO_04=sysdate  WHERE ID_DEPENDENCIA_04={} ",usuHistorico, dependencia.getIdDependencia04() );
		}
		try {
			Ad74aDataBaseAudit.terminarUsuarioAuditor(jdbcTemplate);
		} catch (Exception e) {

		}
		return dependencia;
	}

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

		}

		String query = "SELECT t1.ID_DEPENDENCIA_04 IDDEPENDENCIA04, t1.ID_GRADO_DEPENDENCIA_04 IDGRADODEPENDENCIA04, t1.DESC_OTRA_DEPENDENCIA_04 DESCOTRADEPENDENCIA04, t1.ID_EXPEDIENTE_04 IDEXPEDIENTE04, t1.ID_SOLICITANTE_04 IDSOLICITANTE04, t1.F_RESOLUCION_04 FRESOLUCION04, t1.USU_HISTORICO_04 USUHISTORICO04, t1.F_HISTORICO_04 FHISTORICO04, t1.USU_ALTA_04 USUALTA04, t1.F_ALTA_04 FALTA04 , t1.BAREMO_04 BAREMO04  FROM DEPENDENCIA t1  WHERE t1.ID_SOLICITANTE_04 = ? AND F_HISTORICO_04 IS NULL";

		List<Dependencia> dependenciaList = this.jdbcTemplate.query(query, this.rwMap, depFilter.getIdSolicitante04());
		if (dependenciaList.size() == 0) {
			return null;
		}

		Dependencia result = (Dependencia) DataAccessUtils.uniqueResult(dependenciaList);

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

		}
		return result;
	}
}