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(R977944364) ENABLED START*/
// aggiungere qui eventuali import custom. 
/*PROTECTED REGION END*/

/**
 * @generated
 */
public class PersonaDaoImpl extends AbstractDAO
		implements
			ParameterizedRowMapper<PersonaDto>,
			PersonaDao {
	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 PersonaPk
	 * @generated
	 */

	public PersonaPk insert(PersonaDto dto)

	{
		final String sql = "INSERT INTO "
				+ getTableName()
				+ " ( 	NOME,COGNOME,COGNOME_ACQUISITO,DATA_NASCITA,SESSO,STATO_CIVILE,CODICE_FISCALE,NUMERO_CARATTERISTICO,DATA_INCARICO,CITTA_NASCITA,PROVINCIA_NASCITA ) VALUES (  :NOME , :COGNOME , :COGNOME_ACQUISITO , :DATA_NASCITA , :SESSO , :STATO_CIVILE , :CODICE_FISCALE , :NUMERO_CARATTERISTICO , :DATA_INCARICO , :CITTA_NASCITA , :PROVINCIA_NASCITA  )";

		MapSqlParameterSource params = new MapSqlParameterSource();

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

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

		params.addValue("COGNOME_ACQUISITO", dto.getCognomeAcquisito(),
				java.sql.Types.VARCHAR);

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

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

		params.addValue("STATO_CIVILE", dto.getStatoCivile(),
				java.sql.Types.VARCHAR);

		params.addValue("CODICE_FISCALE", dto.getCodiceFiscale(),
				java.sql.Types.VARCHAR);

		params.addValue("NUMERO_CARATTERISTICO", dto.getNumeroCaratteristico(),
				java.sql.Types.DECIMAL);

		params.addValue("DATA_INCARICO", dto.getDataIncarico(),
				java.sql.Types.DATE);

		params.addValue("CITTA_NASCITA", dto.getCittaNascita(),
				java.sql.Types.VARCHAR);

		params.addValue("PROVINCIA_NASCITA", dto.getProvinciaNascita(),
				java.sql.Types.VARCHAR);

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

		return dto.createPk();

	}

	/** 
	 * Updates a single row in the PERSONA table.
	 * @generated
	 */
	public void update(PersonaDto dto) throws PersonaDaoException {
		final String sql = "UPDATE "
				+ getTableName()
				+ " SET NOME = :NOME ,COGNOME = :COGNOME ,COGNOME_ACQUISITO = :COGNOME_ACQUISITO ,DATA_NASCITA = :DATA_NASCITA ,SESSO = :SESSO ,STATO_CIVILE = :STATO_CIVILE ,NUMERO_CARATTERISTICO = :NUMERO_CARATTERISTICO ,DATA_INCARICO = :DATA_INCARICO ,CITTA_NASCITA = :CITTA_NASCITA ,PROVINCIA_NASCITA = :PROVINCIA_NASCITA  WHERE CODICE_FISCALE = :CODICE_FISCALE ";

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

		MapSqlParameterSource params = new MapSqlParameterSource();

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

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

		params.addValue("COGNOME_ACQUISITO", dto.getCognomeAcquisito(),
				java.sql.Types.VARCHAR);

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

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

		params.addValue("STATO_CIVILE", dto.getStatoCivile(),
				java.sql.Types.VARCHAR);

		params.addValue("CODICE_FISCALE", dto.getCodiceFiscale(),
				java.sql.Types.VARCHAR);

		params.addValue("NUMERO_CARATTERISTICO", dto.getNumeroCaratteristico(),
				java.sql.Types.DECIMAL);

		params.addValue("DATA_INCARICO", dto.getDataIncarico(),
				java.sql.Types.DATE);

		params.addValue("CITTA_NASCITA", dto.getCittaNascita(),
				java.sql.Types.VARCHAR);

		params.addValue("PROVINCIA_NASCITA", dto.getProvinciaNascita(),
				java.sql.Types.VARCHAR);

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

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

	public void delete(PersonaPk pk) throws PersonaDaoException {
		final String sql = "DELETE FROM " + getTableName()
				+ " WHERE CODICE_FISCALE = :CODICE_FISCALE ";

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

		MapSqlParameterSource params = new MapSqlParameterSource();

		params.addValue("CODICE_FISCALE", pk.getCodiceFiscale(),
				java.sql.Types.VARCHAR);

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

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

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

		PersonaDaoRowMapper personaDaoRowMapper = new PersonaDaoRowMapper(null);

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

	protected PersonaDaoRowMapper findByPrimaryKeyRowMapper = new PersonaDaoRowMapper(
			null);
	protected PersonaDaoRowMapper findAllRowMapper = new PersonaDaoRowMapper(
			null);
	protected PersonaDaoRowMapper RowMapper = new PersonaDaoRowMapper(null);

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

	/** 
	 * Returns all rows from the PERSONA table that match the primary key criteria
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	public PersonaDto findByPrimaryKey(PersonaPk pk) throws PersonaDaoException {

		final StringBuilder sql = new StringBuilder(
				"SELECT NOME,COGNOME,COGNOME_ACQUISITO,DATA_NASCITA,SESSO,STATO_CIVILE,CODICE_FISCALE,NUMERO_CARATTERISTICO,DATA_INCARICO,CITTA_NASCITA,PROVINCIA_NASCITA FROM "
						+ getTableName()
						+ " WHERE CODICE_FISCALE = :CODICE_FISCALE ");

		MapSqlParameterSource params = new MapSqlParameterSource();

		params.addValue("CODICE_FISCALE", pk.getCodiceFiscale(),
				java.sql.Types.VARCHAR);

		List<PersonaDto> list = null;

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

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

	}

	/** 
	 * Returns all rows from the PERSONA table that match the criteria ''.
	 * @generated
	 */
	@SuppressWarnings("unchecked")
	public List<PersonaDto> findAll() throws PersonaDaoException {
		final StringBuilder sql = new StringBuilder(
				"SELECT NOME,COGNOME,COGNOME_ACQUISITO,DATA_NASCITA,SESSO,STATO_CIVILE,CODICE_FISCALE,NUMERO_CARATTERISTICO,DATA_INCARICO,CITTA_NASCITA,PROVINCIA_NASCITA FROM "
						+ getTableName());

		MapSqlParameterSource params = new MapSqlParameterSource();

		List<PersonaDto> list = null;

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

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

		return list;

	}

	/** 
	 * Implementazione del finder  query-by-example
	 * @generated
	 */
	public List<PersonaDto> findByExamples_(
			ArrayList<it.csi.demo.democomp.business.business.dao.refappdao.qbe.PersonaExample> positive,
			ArrayList<it.csi.demo.democomp.business.business.dao.refappdao.qbe.PersonaExample> negative)
			throws PersonaDaoException {
		//verifiche consistenza esempi
		if (positive == null) {
			throw new PersonaDaoException(
					"Il set degli esempi positivi e' null. Impossibile costruire la query.");
		}
		if (negative == null) {
			throw new PersonaDaoException(
					"Il set degli esempi negativi e' null. Impossibile costruire la query.");
		}

		if (positive.size() == 0 && negative.size() == 0) {
			throw new PersonaDaoException(
					"Il set degli esempi positivi e negativi e' vuoto. Impossibile costruire la query.");
		}

		// personalizzare la query SQL relativa al finder
		QBEQueryBuilder<PersonaExample> builder = new QBEQueryBuilder<PersonaExample>(
				new PersonaMetadata());
		StringBuilder sql = null;
		try {
			sql = new StringBuilder(builder.createFromExamples(positive,
					negative, false));
		} catch (StringIndexOutOfBoundsException e) {
			throw new PersonaDaoException(
					"E' stato valorizzato almeno un esempio senza nessun FieldCheck associato.Impossibile creare la query.");
		} catch (IllegalArgumentException e) {
			throw new PersonaDaoException(
					"E' stato valorizzato un campo di un esempio complesso non corrispondente alla PK della tabella di lookup.");
		}

		List<PersonaDto> list = null;
		StopWatch stopWatch = new StopWatch(Constants.APPLICATION_CODE);
		try {
			stopWatch.start();
			list = jdbcTemplate.query(sql.toString(), new HashMap(), RowMapper);

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

	/// flexible row mapper. 
	public class PersonaDaoRowMapper
			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 PersonaDaoRowMapper(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 PersonaDto
		 * @generated
		 */
		public PersonaDto mapRow(ResultSet rs, int row) throws SQLException {
			PersonaDto dto = new PersonaDto();
			dto = mapRow_internal(dto, rs, row);
			return dto;
		}

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

		{
			PersonaDto dto = objectToFill;

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

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

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

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

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

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

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

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

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

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

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

			return dto;
		}

	}

}
