/*
* Copyright 2021 E.J.I.E., S.A.
*
* Licencia con arreglo a la EUPL, Versión 1.1 exclusivamente (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en
*
* http://ec.europa.eu/idabc/eupl.html
*
* Salvo cuando lo exija la legislación aplicable o se acuerde por escrito,
* el programa distribuido con arreglo a la Licencia se distribuye «TAL CUAL»,
* SIN GARANT�?AS NI CONDICIONES DE NINGÚN TIPO, ni expresas ni implícitas.
* Véase la Licencia en el idioma concreto que rige los permisos y limitaciones
* que establece la Licencia.
*/
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.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.ProcesosDao;
import com.ejie.ad74a.model.Procesos;

/**
 * ProcesosDaoImpl generated by UDA, 07-oct-2024 11:55:26.
 * 
 * @author UDA
 */

@Repository
@Transactional
public class ProcesosDaoImpl implements ProcesosDao {

	/**
	 * StringBuilder initilization value
	 */
	public static final int STRING_BUILDER_INIT = 4096;

	protected static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDPROCESO98", "TIPOPROCESO98", "PROCESO98",
			"ESTADO98", "FINICIO98", "FFIN98", "ERROR98", "FALTA98", "USUALTA98" };

	private JdbcTemplate jdbcTemplate;
	
	public static final String SEQUENCE_PROCESOS = "SEQ_PROCESOS";

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Procesos> rwMap = new RowMapper<Procesos>() {
		public Procesos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Procesos(resultSet.getLong("IDPROCESO98"), resultSet.getInt("TIPOPROCESO98"),
					resultSet.getString("PROCESO98"), resultSet.getString("ESTADO98"), resultSet.getDate("FINICIO98"),
					resultSet.getDate("FFIN98"), resultSet.getString("ERROR98"), resultSet.getDate("FALTA98"),
					resultSet.getString("USUALTA98"));
		}
	};


	/**
	 * 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 Procesos table.
	 *
	 * @param procesos Procesos
	 *
	 * @return Procesos
	 */
	public Procesos add(Procesos procesos) {
		GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();

		String query = "INSERT INTO PROCESOS (ID_PROCESO_98, TIPO_PROCESO_98, PROCESO_98, ESTADO_98, F_INICIO_98, ERROR_98, F_ALTA_98, USU_ALTA_98, NUM_BATCH_98) "
				+ " VALUES(" + SEQUENCE_PROCESOS
				+ ".NEXTVAL, :tipoProceso,:proceso,:estado,:fInicio,:error,SYSDATE,:usuAlta,:numBatch)";

		MapSqlParameterSource parameters = new MapSqlParameterSource()
				.addValue("tipoProceso", procesos.getTipoProceso98())//
				.addValue("proceso", procesos.getProceso98()) //
				.addValue("estado", procesos.getEstado98())//
				.addValue("fInicio", procesos.getFInicio98())//
				.addValue("error", procesos.getError98())//
				.addValue("usuAlta", procesos.getUsuAlta98())//
				.addValue("numBatch", procesos.getNumBatch98());

		NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
		namedParameterJdbcTemplate.update(query, parameters, generatedKeyHolder, new String[] { "ID_PROCESO_98" });
		procesos.setIdProceso98(generatedKeyHolder.getKey().longValue());

		return procesos;
	}

	/**
	 * Finds a single row in the Procesos table.
	 *
	 * @param procesos Procesos
	 *
	 * @return Procesos
	 */
	@Transactional(readOnly = true)
	public Procesos find(Procesos procesos) {
		String query = "SELECT t1.ID_PROCESO_98 IDPROCESO98, t1.TIPO_PROCESO_98 TIPOPROCESO98, t1.PROCESO_98 PROCESO98, t1.ESTADO_98 ESTADO98, t1.F_INICIO_98 FINICIO98, t1.F_FIN_98 FFIN98, t1.ERROR_98 ERROR98, t1.F_ALTA_98 FALTA98, t1.USU_ALTA_98 USUALTA98 FROM PROCESOS t1  WHERE t1.ID_PROCESO_98 = ?  ";

		List<Procesos> procesosList = this.jdbcTemplate.query(query, this.rwMap, procesos.getIdProceso98());
		return DataAccessUtils.uniqueResult(procesosList);
	}

	/**
	 * Updates a single row in the Procesos table.
	 *
	 * @param procesos Procesos
	 *
	 * @return Procesos
	 */
	public Procesos actualizarAIniciado(Procesos procesos) {
		String query = "UPDATE PROCESOS SET ESTADO_98=?, F_INICIO_98=SYSDATE WHERE ID_PROCESO_98=?";
		this.jdbcTemplate.update(query, "I", procesos.getIdProceso98());
		return procesos;
	}
	
	/**
	 * Updates a single row in the Procesos table.
	 *
	 * @param procesos Procesos
	 *
	 * @return Procesos
	 */
	public Procesos actualizarAFinalizado(Procesos procesos) {
		String query = "UPDATE PROCESOS SET ESTADO_98=?, F_FIN_98=SYSDATE WHERE ID_PROCESO_98=?";
		this.jdbcTemplate.update(query, "F", procesos.getIdProceso98());
		return procesos;
	}
	
	/**
	 * Updates a single row in the Procesos table.
	 *
	 * @param procesos Procesos
	 *
	 * @return Procesos
	 */
	public Procesos actualizarAError(Procesos procesos) {
		String query = "UPDATE PROCESOS SET ESTADO_98=?, ERROR_98=?, F_FIN_98=SYSDATE WHERE ID_PROCESO_98=?";
		this.jdbcTemplate.update(query, "E", procesos.getError98(), procesos.getIdProceso98());
		return procesos;
	}
}
