package it.csi.demo.democomp.business.business.dao.refappdao.dao.impl;

import it.csi.demo.democomp.business.business.dao.refappdao.dao.*;
import it.csi.demo.democomp.business.business.dao.refappdao.dto.*;
import it.csi.demo.democomp.business.business.dao.refappdao.qbe.*;
import it.csi.demo.democomp.business.business.dao.refappdao.metadata.*;
import it.csi.demo.democomp.business.business.dao.refappdao.exceptions.*;
import it.csi.demo.democomp.business.business.dao.util.*;
import it.csi.demo.democomp.business.business.dao.qbe.*;
import java.util.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import it.csi.util.performance.StopWatch;
import org.apache.log4j.Logger;
import java.util.Map;
import java.util.TreeMap;

/*PROTECTED REGION ID(R-857988031) ENABLED START*/
// aggiungere qui eventuali import custom. 
/*PROTECTED REGION END*/

/**
 * @generated
 */
public class CittadinoDaoImpl extends AbstractDAO
		implements
			ParameterizedRowMapper<CittadinoDto>,
			CittadinoDao {
	protected static Logger log = Logger.getLogger(Constants.APPLICATION_CODE);
	/**
	 * @generated
	 */
	protected NamedParameterJdbcTemplate jdbcTemplate;

	/**
	 * @generated
	 */
	public void setJdbcTemplate(NamedParameterJdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

	/**
	 * Method 'insert'
	 * 
	 * @param dto
	 * @return CittadinoPk
	 * @generated
	 */

	public CittadinoPk insert(CittadinoDto dto)

	{
		java.math.BigDecimal newKey = new java.math.BigDecimal(
				incrementer.nextLongValue());

		final String sql = "INSERT INTO "
				+ getTableName()
				+ " ( 	ID_CITTADINO,COGNOME,NOME,SESSO,DATA_NASCITA,ID_COMUNE_NASCITA,ID_COMUNE_RESID,RETRIBUZIONE ) VALUES (  :ID_CITTADINO , :COGNOME , :NOME , :SESSO , :DATA_NASCITA , :ID_COMUNE_NASCITA , :ID_COMUNE_RESID , :RETRIBUZIONE  )";

		MapSqlParameterSource params = new MapSqlParameterSource();
		params.addValue("ID_CITTADINO", newKey, java.sql.Types.DECIMAL);
		params.addValue("COGNOME", dto.getCognome(), java.sql.Types.VARCHAR);
		params.addValue("NOME", dto.getNome(), java.sql.Types.VARCHAR);
		params.addValue("SESSO", dto.getSesso(), java.sql.Types.CHAR);
		params.addValue("DATA_NASCITA", dto.getDataNascita(),
				java.sql.Types.DATE);
		params.addValue("ID_COMUNE_NASCITA", dto.getIdComuneNascita(),
				java.sql.Types.DECIMAL);
		params.addValue("ID_COMUNE_RESID", dto.getIdComuneResid(),
				java.sql.Types.DECIMAL);
		params.addValue("RETRIBUZIONE", dto.getRetribuzione(),
				java.sql.Types.DECIMAL);
		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			jdbcTemplate.update(sql.toString(), params);
		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::insert] esecuzione query", ex);
			throw ex;
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "insert",
					"esecuzione query", sql);
			log.debug("[CittadinoDaoImpl::insert] END");
		}

		dto.setIdCittadino(newKey);
		return dto.createPk();

	}

	/** 
	 * Updates a single row in the REFAPP_T_CITTADINO table.
	 * @generated
	 */
	public void update(CittadinoDto dto) throws CittadinoDaoException {
		final String sql = "UPDATE "
				+ getTableName()
				+ " SET COGNOME = :COGNOME ,NOME = :NOME ,SESSO = :SESSO ,DATA_NASCITA = :DATA_NASCITA ,ID_COMUNE_NASCITA = :ID_COMUNE_NASCITA ,ID_COMUNE_RESID = :ID_COMUNE_RESID ,RETRIBUZIONE = :RETRIBUZIONE  WHERE ID_CITTADINO = :ID_CITTADINO ";

		if (dto.getIdCittadino() == null) {
			log.error("[CittadinoDaoImpl::update] chiave primaria non impostata");
			throw new CittadinoDaoException("Chiave primaria non impostata");
		}

		MapSqlParameterSource params = new MapSqlParameterSource();

		params.addValue("ID_CITTADINO", dto.getIdCittadino(),
				java.sql.Types.DECIMAL);

		params.addValue("COGNOME", dto.getCognome(), java.sql.Types.VARCHAR);

		params.addValue("NOME", dto.getNome(), java.sql.Types.VARCHAR);

		params.addValue("SESSO", dto.getSesso(), java.sql.Types.CHAR);

		params.addValue("DATA_NASCITA", dto.getDataNascita(),
				java.sql.Types.DATE);

		params.addValue("ID_COMUNE_NASCITA", dto.getIdComuneNascita(),
				java.sql.Types.DECIMAL);

		params.addValue("ID_COMUNE_RESID", dto.getIdComuneResid(),
				java.sql.Types.DECIMAL);

		params.addValue("RETRIBUZIONE", dto.getRetribuzione(),
				java.sql.Types.DECIMAL);

		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			jdbcTemplate.update(sql.toString(), params);
		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::update] esecuzione query", ex);
			throw new CittadinoDaoException("Query failed", ex);
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "update",
					"esecuzione query", sql);
			log.debug("[CittadinoDaoImpl::update] END");
		}
	}

	/** 
	 * Deletes a single row in the REFAPP_T_CITTADINO table.
	 * @generated
	 */

	public void delete(CittadinoPk pk) throws CittadinoDaoException {
		final String sql = "DELETE FROM " + getTableName()
				+ " WHERE ID_CITTADINO = :ID_CITTADINO ";

		if (pk == null) {
			log.error("[CittadinoDaoImpl::delete] chiave primaria non impostata");
			throw new CittadinoDaoException("Chiave primaria non impostata");
		}

		MapSqlParameterSource params = new MapSqlParameterSource();

		params.addValue("ID_CITTADINO", pk.getIdCittadino(),
				java.sql.Types.DECIMAL);

		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			jdbcTemplate.update(sql.toString(), params);
		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::delete] esecuzione query", ex);
			throw new CittadinoDaoException("Query failed", ex);
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "delete",
					"esecuzione query", sql);
			log.debug("[CittadinoDaoImpl::delete] END");
		}
	}

	/**
	 * Method 'mapRow'
	 * 
	 * @param rs
	 * @param row
	 * @throws SQLException
	 * @return CittadinoDto
	 * @generated
	 */
	public CittadinoDto mapRow(ResultSet rs, int row) throws SQLException {
		CittadinoDto dto = new CittadinoDto();
		dto = mapRow_internal(dto, rs, row);
		return dto;
	}

	/**
	 * Method 'mapRow_internal'
	 * 
	 * @param rs
	 * @param row
	 * @throws SQLException
	 * @return CittadinoDto
	 * @generated
	 */
	public CittadinoDto mapRow_internal(CittadinoDto objectToFill,
			ResultSet rs, int row) throws SQLException {
		CittadinoDto dto = objectToFill;

		CittadinoDaoRowMapper cittadinoDaoRowMapper = new CittadinoDaoRowMapper(
				null);

		return cittadinoDaoRowMapper.mapRow_internal(objectToFill, rs, row);
	}

	protected CittadinoDaoRowMapper findByPrimaryKeyRowMapper = new CittadinoDaoRowMapper(
			null);
	protected CittadinoDaoRowMapper findAllRowMapper = new CittadinoDaoRowMapper(
			null);
	protected CittadinoDaoRowMapper findByLocRowMapper = new CittadinoDaoRowMapper(
			null);

	/**
	 * Method 'getTableName'
	 * 
	 * @return String
	 * @generated
	 */
	public String getTableName() {
		return "REFAPP_T_CITTADINO";
	}

	/** 
	 * Returns all rows from the REFAPP_T_CITTADINO table that match the primary key criteria
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	public CittadinoDto findByPrimaryKey(CittadinoPk pk)
			throws CittadinoDaoException {

		final StringBuilder sql = new StringBuilder(
				"SELECT ID_CITTADINO,COGNOME,NOME,SESSO,DATA_NASCITA,ID_COMUNE_NASCITA,ID_COMUNE_RESID,RETRIBUZIONE FROM "
						+ getTableName()
						+ " WHERE ID_CITTADINO = :ID_CITTADINO ");

		MapSqlParameterSource params = new MapSqlParameterSource();

		params.addValue("ID_CITTADINO", pk.getIdCittadino(),
				java.sql.Types.DECIMAL);

		List<CittadinoDto> list = null;

		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			list = jdbcTemplate.query(sql.toString(), params,
					findByPrimaryKeyRowMapper);
		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::findByPrimaryKey] esecuzione query",
					ex);
			throw new CittadinoDaoException("Query failed", ex);
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "findByPrimaryKey",
					"esecuzione query", sql.toString());
			log.debug("[CittadinoDaoImpl::findByPrimaryKey] END");
		}

		return list.size() == 0 ? null : list.get(0);

	}

	/** 
	 * Returns all rows from the REFAPP_T_CITTADINO table that match the criteria ''.
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	public List<CittadinoDto> findAll() throws CittadinoDaoException {
		final StringBuilder sql = new StringBuilder(
				"SELECT ID_CITTADINO,COGNOME,NOME,SESSO,DATA_NASCITA,ID_COMUNE_NASCITA,ID_COMUNE_RESID,RETRIBUZIONE FROM "
						+ getTableName());

		MapSqlParameterSource params = new MapSqlParameterSource();

		List<CittadinoDto> list = null;

		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			list = jdbcTemplate.query(sql.toString(), params, findAllRowMapper);

		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::findAll] esecuzione query", ex);
			throw new CittadinoDaoException("Query failed", ex);
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "findAll",
					"esecuzione query", sql.toString());
			log.debug("[CittadinoDaoImpl::findAll] END");
		}

		return list;

	}

	/** 
	 * Implementazione del finder findByLoc
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	public List<CittadinoDto> findFindByLoc(
			it.csi.demo.democomp.dto.nspersona.Persona input)
			throws CittadinoDaoException {
		StringBuilder sql = new StringBuilder();
		MapSqlParameterSource paramMap = new MapSqlParameterSource();
		/*PROTECTED REGION ID(R-1084231515) ENABLED START*/
		// la clausola select e'customizzabile poiche' il finder ha l'attributo customSelect == true
		sql.append("SELECT ID_CITTADINO,COGNOME,NOME,SESSO,DATA_NASCITA,ID_COMUNE_NASCITA,ID_COMUNE_RESID,RETRIBUZIONE ");
		/*PROTECTED REGION END*/
		/*PROTECTED REGION ID(R-1632786029) ENABLED START*/
		// la clausola from e'customizzabile poiche' il finder ha l'attributo customFrom==true
		sql.append(" FROM REFAPP_T_CITTADINO, REFAPP_D_PROVINCIA, REFAPP_D_COMUNE");
		/*PROTECTED REGION END*/
		sql.append(" WHERE ");
		/*PROTECTED REGION ID(R933479423) ENABLED START*/
		String wcond = "";
		// personalizzare l'elenco dei parametri da passare al jdbctemplate (devono corrispondere in tipo e
		// numero ai parametri definiti nella queryString)

		if ((input.getCognome().length() > 0)) {
			wcond += " UPPER(COGNOME) LIKE :cognome";
			paramMap.addValue("cognome", input.getCognome());
		}

		if (input.getCodRegione() != 0) {
			if (wcond.length() > 0) {
				wcond += " AND refapp_d_provincia.id_regione = :idregione";
			} else {
				wcond += " refapp_d_provincia.id_regione = :idregione";
			}
			paramMap.addValue("idregione", input.getCodRegione());
		}

		if (input.getCodProvincia() != 0) {
			if (wcond.length() > 0) {
				wcond += " AND refapp_d_provincia.id_provincia = :idprovincia";
			} else {
				wcond += " refapp_d_provincia.id_provincia = :idprovincia";
			}
			paramMap.addValue("idprovincia", input.getCodProvincia());
		}

		if (input.getRetribuzione() != 0) {
			if (wcond.length() > 0) {
				wcond += " AND retribuzione > :retribuzione";
			} else {
				wcond += " retribuzione > :retribuzione";
			}
			paramMap.addValue("retribuzione", input.getRetribuzione());
		}

		sql.append(wcond);
		// condizione di JOIN

		sql.append(" AND refapp_t_cittadino.id_comune_resid = refapp_d_comune.id_comune");
		sql.append(" AND refapp_d_comune.id_provincia = refapp_d_provincia.id_provincia");

		/*PROTECTED REGION END*/

		/*PROTECTED REGION ID(R-1002022709) ENABLED START*/
		//***aggiungere tutte le condizioni

		// non usata in quanto tutti il codice è stato inserito nella precedente regione protetta
		//paramMap.put("nome", input);

		/*PROTECTED REGION END*/
		List<CittadinoDto> list = null;
		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			list = jdbcTemplate.query(sql.toString(), paramMap,
					findByLocRowMapper);

		} catch (RuntimeException ex) {
			log.error("[CittadinoDaoImpl::findFindByLoc] esecuzione query", ex);
			throw new CittadinoDaoException("Query failed", ex);
		} finally {
			stopWatch.dumpElapsed("CittadinoDaoImpl", "findFindByLoc",
					"esecuzione query", sql.toString());
			log.debug("[CittadinoDaoImpl::findFindByLoc] END");
		}
		return list;
	}

	/// flexible row mapper. 
	public class CittadinoDaoRowMapper
			implements
				org.springframework.jdbc.core.RowMapper {

		private java.util.HashMap<String, String> columnsToReadMap = new java.util.HashMap<String, String>();
		private boolean mapAllColumns = true;

		/**
		 * @param columnsToRead elenco delle colonne da includere nel mapping (per query
		 *        incomplete, esempio distinct, custom select...)
		 */
		public CittadinoDaoRowMapper(String[] columnsToRead) {
			if (columnsToRead != null) {
				mapAllColumns = false;
				for (int i = 0; i < columnsToRead.length; i++)
					columnsToReadMap.put(columnsToRead[i], columnsToRead[i]);
			}
		}

		/**
		 * Method 'mapRow'
		 * 
		 * @param rs
		 * @param row
		 * @throws SQLException
		 * @return CittadinoDto
		 * @generated
		 */
		public CittadinoDto mapRow(ResultSet rs, int row) throws SQLException {
			CittadinoDto dto = new CittadinoDto();
			dto = mapRow_internal(dto, rs, row);
			return dto;
		}

		/**
		 * Method 'mapRow_internal'
		 * 
		 * @param rs
		 * @param row
		 * @throws SQLException
		 * @return CittadinoDto
		 * @generated
		 */
		public CittadinoDto mapRow_internal(CittadinoDto objectToFill,
				ResultSet rs, int row) throws SQLException

		{
			CittadinoDto dto = objectToFill;

			if (mapAllColumns || columnsToReadMap.get("ID_CITTADINO") != null)
				dto.setIdCittadino(rs.getBigDecimal("ID_CITTADINO"));

			if (mapAllColumns || columnsToReadMap.get("COGNOME") != null)
				dto.setCognome(rs.getString("COGNOME"));

			if (mapAllColumns || columnsToReadMap.get("NOME") != null)
				dto.setNome(rs.getString("NOME"));

			if (mapAllColumns || columnsToReadMap.get("SESSO") != null)
				dto.setSesso(rs.getString("SESSO"));

			if (mapAllColumns || columnsToReadMap.get("DATA_NASCITA") != null)
				dto.setDataNascita(rs.getDate("DATA_NASCITA"));

			if (mapAllColumns
					|| columnsToReadMap.get("ID_COMUNE_NASCITA") != null)
				dto.setIdComuneNascita(rs.getBigDecimal("ID_COMUNE_NASCITA"));

			if (mapAllColumns
					|| columnsToReadMap.get("ID_COMUNE_RESID") != null)
				dto.setIdComuneResid(rs.getBigDecimal("ID_COMUNE_RESID"));

			if (mapAllColumns || columnsToReadMap.get("RETRIBUZIONE") != null)
				dto.setRetribuzione(rs.getBigDecimal("RETRIBUZIONE"));

			return dto;
		}

	}

}
