package com.ejie.m62fb.dao.registroVPP;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.m62fb.model.ExpedienteSancionador;
import com.ejie.m62fb.model.Vivienda;
import com.ejie.m62fb.utils.sql.BDUtils;
import com.ejie.m62fb.utils.sql.UtilsResulSet;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridRequestDto;

/**
 * ExpedienteSancionadorDaoImpl generated by UDA, 12-nov-2015 17:14:32.
 * 
XXXX
 */
@Repository
@Transactional
public class ExpedienteSancionadorDaoImpl implements ExpedienteSancionadorDao {
	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private final RowMapper<ExpedienteSancionador> rwMap = new RowMapper<ExpedienteSancionador>() {
		@Override
		public ExpedienteSancionador mapRow(ResultSet resultSet, int rowNum)
				throws SQLException {
			ExpedienteSancionador expedienteSancionador = new ExpedienteSancionador();

			// Cod. Expediente
			expedienteSancionador.setCodExpediente(resultSet
					.getString("CODEXPEDIENTE"));

			// Cod. Externo
			expedienteSancionador.setCodExterno(resultSet
					.getString("CODEXTERNO"));

			// Tipo Expediente Origen
			expedienteSancionador.setTipoExpedienteOrigen(resultSet
					.getString("TIPOEXPEDIENTEORIGEN"));

			// Num. Vivienda
			expedienteSancionador.setVivienda(new Vivienda());
			expedienteSancionador.getVivienda().setNumVivienda(
					UtilsResulSet.getBigDecimal(resultSet, "NUMVIVIENDA"));

			// Persona Sancionada
			expedienteSancionador.setPersonaSancionada(resultSet
					.getString("PERSONASANCIONADA"));

			// Fecha Designacion
			expedienteSancionador.setFecDesignacion(resultSet
					.getTimestamp("FECDESIGNACION"));

			// Fecha Caducidad
			expedienteSancionador.setFecCaducidad(resultSet
					.getTimestamp("FECCADUCIDAD"));

			// Fecha Propuesta
			expedienteSancionador.setFecPropuesta(resultSet
					.getTimestamp("FECPROPUESTA"));

			// Fecha Resolucion
			expedienteSancionador.setFecResolucion(resultSet
					.getTimestamp("FECRESOLUCION"));

			// Tipo Resolucion
			expedienteSancionador.setTipoResolucion(resultSet
					.getString("TIPORESOLUCION"));

			// Importe
			expedienteSancionador.setImporteSancion(UtilsResulSet.getImporte(
					resultSet, "IMPORTE"));

			// Indicador Multa
			expedienteSancionador.setIndMulta(resultSet
					.getString("INDMULTACOERCITIVA"));

			// Indicador Recurso
			expedienteSancionador.setIndRecurso(resultSet
					.getString("INDRECURSO"));

			// Provincia
			expedienteSancionador
					.setProvincia(resultSet.getString("PROVINCIA"));

			// Municipio
			expedienteSancionador
					.setMunicipio(resultSet.getString("MUNICIPIO"));

			return expedienteSancionador;
		}
	};

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

	/*
	 * OPERACIONES CRUD
	 */

	/**
	 * Finds rows in the ExpedienteSancionador table using like.
	 * 
	 * @param expedienteSancionador
	 *            ExpedienteSancionador
	 * @param jqGridRequestDto
	 *            JQGridRequestDto
	 * @param startsWith
	 *            Boolean
	 * @return List<ExpedienteSancionador>
	 */
	@Override
	@Transactional(readOnly = true)
	public List<ExpedienteSancionador> findAllLike(
			ExpedienteSancionador expedienteSancionador,
			JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_FIND_ALL);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(expedienteSancionador,
				startsWith);
		StringBuilder where = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_WHERE_ALL);
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		if (jqGridRequestDto != null) {
			query = JQGridManager.getPaginationQuery(jqGridRequestDto, query);
		}

		return this.jdbcTemplate.query(query.toString(), this.rwMap,
				params.toArray());
	}

	/*
	 * OPERACIONES RUP_TABLE
	 */

	/**
	 * Counts rows in the ExpedienteSancionador table.
	 * 
	 * @param expedienteSancionador
	 *            ExpedienteSancionador
	 * @return Long
	 */
	@Override
	@Transactional(readOnly = true)
	public Long findAllCount(ExpedienteSancionador expedienteSancionador) {
		StringBuilder query = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_FIND_ALL_COUNT);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(expedienteSancionador);
		StringBuilder where = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_WHERE_ALL);
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForLong(query.toString(),
				params.toArray());
	}

	/**
	 * Counts rows in the ExpedienteSancionador table using like.
	 * 
	 * @param expedienteSancionador
	 *            ExpedienteSancionador
	 * @param startsWith
	 *            Boolean
	 * @return Long
	 */
	@Override
	@Transactional(readOnly = true)
	public Long findAllLikeCount(ExpedienteSancionador expedienteSancionador,
			Boolean startsWith) {
		StringBuilder query = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_FIND_ALL_COUNT);

		// Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereLikeMap(expedienteSancionador,
				startsWith);
		StringBuilder where = new StringBuilder(
				ExpedienteSancionadorDaoSql.SQL_WHERE_ALL);
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return this.jdbcTemplate.queryForLong(query.toString(),
				params.toArray());
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the ExpedienteSancionador entity
	 * 
	 * @param expedienteSancionador
	 *            ExpedienteSancionador Bean with the criteria values to filter
	 *            by.
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - Generación de código de UDA
	private Map<String, ?> getWhereMap(
			ExpedienteSancionador expedienteSancionador) {

		StringBuilder where = new StringBuilder(
				ExpedienteSancionadorDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (expedienteSancionador != null) {
			if (expedienteSancionador.getVivienda() != null) {
				// NumVivienda
				if (expedienteSancionador.getVivienda().getNumVivienda() != null) {
					BDUtils.crearFiltroIgual(where, params,
							"EXPSANCIO.NUM_VIVIENDA", expedienteSancionador
									.getVivienda().getNumVivienda());
				}
			}
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the ExpedienteSancionador entity
	 * 
	 * @param expedienteSancionador
	 *            ExpedienteSancionador Bean with the criteria values to filter
	 *            by.
	 * @param startsWith
	 *            Boolean
	 * @return Map created with two keys key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the
	 *         condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - Generación de código de UDA
	private Map<String, Object> getWhereLikeMap(
			ExpedienteSancionador expedienteSancionador, Boolean startsWith) {

		StringBuilder where = new StringBuilder(
				ExpedienteSancionadorDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (expedienteSancionador != null) {
			if (expedienteSancionador.getVivienda() != null) {
				// NumVivienda
				if (expedienteSancionador.getVivienda().getNumVivienda() != null) {
					BDUtils.crearFiltroIgual(where, params,
							"EXPSANCIO.NUM_VIVIENDA", expedienteSancionador
									.getVivienda().getNumVivienda());
				}
			}
		}

		Map<String, Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

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