package com.ejie.ab79.dao.expedientes;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
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.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.model.REST.servicioWeb.Ubicacion;
import com.ejie.ab79.model.expedientes.DatosDirecciones;
import com.ejie.ab79.model.expedientes.DatosTerceros;
import com.ejie.ab79.model.expedientes.Sexo;
import com.ejie.ab79.model.expedientes.TiposDireccion;
import com.ejie.ab79.model.expedientes.TiposDocumento;
import com.ejie.ab79.model.inspecciones.Inspecciones;
import com.ejie.ab79.model.nora.T17Localidad;
import com.ejie.ab79.model.nora.T17Municipio;
import com.ejie.ab79.model.nora.T17Pais;
import com.ejie.ab79.model.nora.T17Provincia;

/**
 * DatosDireccionesDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class DatosDireccionesDaoImpl implements DatosDireccionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDDIRECCION", "DIRECCION", "NUMERO", "ESCALERA",
			"ESTABLECIMIENTO", "PISO", "LETRA", "CODIGOPOSTAL", "IDPROVINCIA", "IDMUNICIPIO", "IDLOCALIDAD",
			"FECHAREGISTRO", "USUARIOREGISTRO", "FECHAULTMODIFICACION", "USUARIOULTMODIFICACION",
			"COMPLEMENTODIRECCION", "DATOSTERCEROSIDTERCERO", "DATOSTERCEROSDOCUMENTO", "DATOSTERCEROSIDTIPODOCUMENTO",
			"DATOSTERCEROSNOMBRE", "DATOSTERCEROSAPELLIDO1", "DATOSTERCEROSAPELLIDO2", "DATOSTERCEROSIDSEXO",
			"DATOSTERCEROSTELEFONO", "DATOSTERCEROSEMAIL", "DATOSTERCEROSIDIOMA", "DATOSTERCEROSTIPOPARTICIPANTE",
			"DATOSTERCEROSFECHAREGISTRO", "DATOSTERCEROSUSUARIOREGISTRO", "DATOSTERCEROSFULTMOD",
			"DATOSTERCEROSUULTMOD", "TIPOSDIRECCIONIDTIPODIRECCION", "TIPOSDIRECCIONDESCRIPCIONCASTELLANO",
			"TIPOSDIRECCIONDESCRIPCIONEUSKERA", "TIPOSDIRECCIONFECHAREGISTRO", "TIPOSDIRECCIONUSUARIOREGISTRO",
			"DATOSTERCEROSIDREPRESENTANTE" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<DatosDirecciones> rwMapFind = new RowMapper<DatosDirecciones>() {
		@Override
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DatosDirecciones datosDireccion = new DatosDirecciones();
			datosDireccion.setIdDireccion(resultSet.getInt("IDDIRECCION"));
			datosDireccion.setEstablecimiento(resultSet.getString("ESTABLECIMIENTO"));
			datosDireccion.setIdentificadorEstablecimiento(resultSet.getString("IDENTIFICADORESTABLECIMIENTO"));
			datosDireccion.setDireccion(resultSet.getString("DIRECCION"));
			datosDireccion.setNumero(resultSet.getString("NUMERO"));
			datosDireccion.setEscalera(resultSet.getString("ESCALERA"));
			datosDireccion.setPiso(resultSet.getString("PISO"));
			datosDireccion.setLetra(resultSet.getString("LETRA"));
			datosDireccion.setCodigoPostal(resultSet.getString("CODIGOPOSTAL"));
			datosDireccion.setIdProvincia(resultSet.getLong("IDPROVINCIA"));
			datosDireccion.setIdMunicipio(resultSet.getLong("IDMUNICIPIO"));
			datosDireccion.setIdLocalidad(resultSet.getLong("IDLOCALIDAD"));
			datosDireccion.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));
			datosDireccion.setUsuarioUltmodificacion(resultSet.getString("USUARIOULTMODIFICACION"));
			datosDireccion.setComplementoDireccion(resultSet.getString("COMPLEMENTODIRECCION"));

			T17Provincia provincia = new T17Provincia();
			provincia.setId(String.valueOf(resultSet.getLong("IDPROVINCIA")));
			datosDireccion.setProvincia(provincia);

			TiposDocumento tipoDocumento = new TiposDocumento();
			tipoDocumento.setIdTipoDocumento(resultSet.getLong("DatosTercerosIDTIPODOCUMENTO"));

			DatosTerceros datosTercero = new DatosTerceros();
			datosTercero.setIdTercero(resultSet.getInt("DatosTercerosIDTERCERO"));
			datosTercero.setDocumento(resultSet.getString("DatosTercerosDOCUMENTO"));
			datosTercero.setNombre(resultSet.getString("DatosTercerosNOMBRE"));
			datosTercero.setApellido1(resultSet.getString("DatosTercerosAPELLIDO1"));
			datosTercero.setApellido2(resultSet.getString("DatosTercerosAPELLIDO2"));
			datosTercero.setSexo(new Sexo(resultSet.getLong("DatosTercerosIDSEXO")));
			datosTercero.setTelefono(resultSet.getLong("DatosTercerosTELEFONO"));
			datosTercero.setEmail(resultSet.getString("DatosTercerosEMAIL"));
			datosTercero.setIdioma(resultSet.getInt("DatosTercerosIDIOMA"));
			datosTercero.setTipoParticipante(resultSet.getInt("DatosTercerosTIPOPARTICIPANTE"));
			datosTercero.setUsuarioRegistro(resultSet.getString("DatosTercerosUSUARIOREGISTRO"));
			datosTercero.setUsuarioUltmodificacion(resultSet.getString("DatosTercerosUSUARIOULTMODIF"));

			TiposDireccion tipoDireccion = new TiposDireccion();
			tipoDireccion.setIdTipoDireccion(resultSet.getLong("TiposDireccionIDTIPODIRECCION"));
			tipoDireccion.setDescripcionCastellano(resultSet.getString("TiposDireccionDESCRIPCIONES"));
			tipoDireccion.setDescripcionEuskera(resultSet.getString("TiposDireccionDESCRIPCIONEU"));
			tipoDireccion.setUsuarioRegistro(resultSet.getString("TiposDireccionUSUARIOREGISTRO"));

			datosTercero.setTipoDocumento(tipoDocumento);
			datosDireccion.setDatosTerceros(datosTercero);
			datosDireccion.setTiposDireccion(tipoDireccion);

			return datosDireccion;

		}
	};

	private RowMapper<DatosDirecciones> rwMapDomicilioUbicacion = new RowMapper<DatosDirecciones>() {
		@Override
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			DatosDirecciones datosDirecciones = new DatosDirecciones();
			datosDirecciones.setIdDireccion(resultSet.getInt("IDDIRECCION"));
			datosDirecciones.setDireccion(resultSet.getString("DIRECCION"));
			datosDirecciones.setNumero(resultSet.getString("NUMERO"));
			datosDirecciones.setEscalera(resultSet.getString("ESCALERA"));
			datosDirecciones.setPiso(resultSet.getString("PISO"));
			datosDirecciones.setLetra(resultSet.getString("LETRA"));
			datosDirecciones.setCodigoPostal(resultSet.getString("CODIGOPOSTAL"));
			datosDirecciones.setEstablecimiento(resultSet.getString("ESTABLECIMIENTO"));
			datosDirecciones.setIdentificadorEstablecimiento(resultSet.getString("IDENTESTABLECIMIENTO"));
			datosDirecciones.setComplementoDireccion(resultSet.getString("COMPLEMENTODIRECCION"));
			datosDirecciones.setDescripcionCiudad(resultSet.getString("DESCRIPCIONCIUDAD"));
			datosDirecciones.setDescripcionProvincia(resultSet.getString("DESCRIPCIONPROVINCIA"));
			datosDirecciones.setIdProvincia(resultSet.getLong("IDPROVINCIA"));
			datosDirecciones.setIdMunicipio(resultSet.getLong("IDMUNICIPIO"));
			datosDirecciones.setIdLocalidad(resultSet.getLong("IDLOCALIDAD"));

			DatosTerceros datosTercero = new DatosTerceros();
			datosTercero.setIdTercero(resultSet.getInt("IDTERCERO"));
			datosDirecciones.setDatosTerceros(datosTercero);

			TiposDireccion tipoDireccion = new TiposDireccion();
			tipoDireccion.setIdTipoDireccion(resultSet.getLong("IDTIPODIRECCION"));
			datosDirecciones.setTiposDireccion(tipoDireccion);

			T17Provincia provincia = new T17Provincia();
			provincia.setId(resultSet.getString("IDPROVINCIA"));
			datosDirecciones.setProvincia(provincia);

			T17Municipio municipio = new T17Municipio();
			municipio.setId(resultSet.getString("IDMUNICIPIO"));
			datosDirecciones.setMunicipio(municipio);

			T17Localidad localidad = new T17Localidad();
			localidad.setId(resultSet.getString("IDLOCALIDAD"));
			datosDirecciones.setLocalidad(localidad);

			T17Pais pais = new T17Pais();
			pais.setId(resultSet.getString("IDPAIS"));
			datosDirecciones.setPais(pais);

			return datosDirecciones;
		}
	};

	private RowMapper<DatosDirecciones> rwMapUbicacionTerceroId = new RowMapper<DatosDirecciones>() {
		@Override
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			DatosDirecciones datosDirecciones = new DatosDirecciones();
			datosDirecciones.setIdDireccion(resultSet.getInt("IDDIRECCION"));
			datosDirecciones.setEstablecimiento(resultSet.getString("ESTABLECIMIENTO"));
			datosDirecciones.setDireccion(resultSet.getString("DIRECCION"));
			datosDirecciones.setNumero(resultSet.getString("NUMERO"));
			datosDirecciones.setEscalera(resultSet.getString("ESCALERA"));
			datosDirecciones.setPiso(resultSet.getString("PISO"));
			datosDirecciones.setLetra(resultSet.getString("LETRA"));
			datosDirecciones.setCodigoPostal(resultSet.getString("CODIGOPOSTAL"));
			datosDirecciones.setIdPais(resultSet.getLong("IDPAIS"));
			datosDirecciones.setIdProvincia(resultSet.getLong("IDPROVINCIA"));
			datosDirecciones.setIdMunicipio(resultSet.getLong("IDMUNICIPIO"));
			datosDirecciones.setIdLocalidad(resultSet.getLong("IDLOCALIDAD"));
			datosDirecciones.setIdentificadorEstablecimiento(resultSet.getString("IDENTIFICADORESTABLECIMIENTO"));
			datosDirecciones.setComplementoDireccion(resultSet.getString("COMPLEMENTODIRECCION"));

			/* Datos Terceros */
			DatosTerceros datosTercerosAux = new DatosTerceros();
			datosTercerosAux.setIdTercero(resultSet.getInt("IDTERCERO"));
			datosDirecciones.setDatosTerceros(datosTercerosAux);
			/* Tipos Direccion */
			TiposDireccion tiposDireccionAux = new TiposDireccion();
			tiposDireccionAux.setIdTipoDireccion(resultSet.getLong("IDTIPODIRECCION"));
			tiposDireccionAux.setDescripcionCastellano(resultSet.getString("DESCASTELLANO"));
			tiposDireccionAux.setDescripcionEuskera(resultSet.getString("DESEUSKERA"));
			datosDirecciones.setTiposDireccion(tiposDireccionAux);

			return datosDirecciones;
		}
	};

	private RowMapper<Ubicacion> rwMapUbicacion = new RowMapper<Ubicacion>() {
		@Override
		public Ubicacion mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			Ubicacion ubicacion = new Ubicacion();
			ubicacion.setIdTipoDireccion(resultSet.getLong("idtipodireccion"));
			ubicacion.setIdentificadorEstablecimiento(resultSet.getString("identificadorestablecimiento"));
			ubicacion.setEstablecimiento(resultSet.getString("establecimiento"));
			ubicacion.setDireccion(resultSet.getString("direccion"));
			ubicacion.setNumero(resultSet.getString("numero"));
			ubicacion.setEscalera(resultSet.getString("escalera"));
			ubicacion.setPiso(resultSet.getString("piso"));
			ubicacion.setLetra(resultSet.getString("letra"));
			ubicacion.setCodigoPostal(resultSet.getString("codigopostal"));
			ubicacion.setIdProvincia(resultSet.getString("idprovincia"));
			ubicacion.setIdMunicipio(resultSet.getString("idmunicipio"));
			ubicacion.setIdLocalidad(resultSet.getString("idlocalidad"));

			return ubicacion;
		}
	};

	private RowMapper<DatosDirecciones> rwMapFindIdEstablecimiento = new RowMapper<DatosDirecciones>() {
		@Override
		public DatosDirecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new DatosDirecciones(resultSet.getString("IDENTIFICADORESTABLECIMIENTO"));
		}
	};

	/**
	 * 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 DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	@Override
	public DatosDirecciones add(DatosDirecciones datosdirecciones) {

		int idDatosDireccion = this.jdbcTemplate.queryForObject("SELECT AB61.S_AB6136T00.NEXTVAL FROM DUAL",
				Integer.class);
		datosdirecciones.setIdDireccion(idDatosDireccion);

		String query = "INSERT INTO DATOS_DIRECCIONES (ID_DIRECCION, ID_TERCERO, ID_TIPO_DIRECCION, DIRECCION,  NUMERO, ESCALERA, PISO, LETRA, CODIGO_POSTAL, ID_PROVINCIA, ID_MUNICIPIO, ID_LOCALIDAD, IDENTIFICADOR_ESTABLECIMIENTO, ESTABLECIMIENTO, FECHA_REGISTRO, USUARIO_REGISTRO, COMPLEMENTO_DIRECCION) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,SYSDATE,?,?)";
		Object getDatosTercerosIdTerceroAux = null;
		if (datosdirecciones.getDatosTerceros() != null && datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			getDatosTercerosIdTerceroAux = datosdirecciones.getDatosTerceros().getIdTercero();
		}
		Object getTiposDireccionIdTipoDireccionAux = null;
		if (datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			getTiposDireccionIdTipoDireccionAux = datosdirecciones.getTiposDireccion().getIdTipoDireccion();
		}
		this.jdbcTemplate.update(query, datosdirecciones.getIdDireccion(), getDatosTercerosIdTerceroAux,
				getTiposDireccionIdTipoDireccionAux, datosdirecciones.getDireccion(), datosdirecciones.getNumero(),
				datosdirecciones.getEscalera(), datosdirecciones.getPiso(), datosdirecciones.getLetra(),
				datosdirecciones.getCodigoPostal(), datosdirecciones.getIdProvincia(),
				datosdirecciones.getIdMunicipio(), datosdirecciones.getIdLocalidad(),
				datosdirecciones.getIdentificadorEstablecimiento(), datosdirecciones.getEstablecimiento(),
				datosdirecciones.getUsuarioRegistro(), datosdirecciones.getComplementoDireccion());
		return datosdirecciones;
	}

	/**
	 * Updates a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	@Override
	public DatosDirecciones update(DatosDirecciones datosdirecciones) {
		String query = "UPDATE DATOS_DIRECCIONES SET  DIRECCION=?, NUMERO=?, ESTABLECIMIENTO=?, ESCALERA=?,   PISO=?,  LETRA=?,   CODIGO_POSTAL=?,   ID_PROVINCIA=?,  ID_MUNICIPIO=?,   ID_LOCALIDAD=?, IDENTIFICADOR_ESTABLECIMIENTO = ?,   FECHA_ULTMODIFICACION=SYSDATE,  USUARIO_ULTMODIFICACION=?, COMPLEMENTO_DIRECCION=?   WHERE ID_TERCERO=?  AND ID_TIPO_DIRECCION=?";
		Object getDatosTercerosIdTerceroAux = null;
		if (datosdirecciones.getDatosTerceros() != null && datosdirecciones.getDatosTerceros().getIdTercero() != null) {
			getDatosTercerosIdTerceroAux = datosdirecciones.getDatosTerceros().getIdTercero();
		}
		Object getTiposDireccionIdTipoDireccionAux = null;
		if (datosdirecciones.getTiposDireccion() != null
				&& datosdirecciones.getTiposDireccion().getIdTipoDireccion() != null) {
			getTiposDireccionIdTipoDireccionAux = datosdirecciones.getTiposDireccion().getIdTipoDireccion();
		}

		this.jdbcTemplate.update(query, datosdirecciones.getDireccion(), datosdirecciones.getNumero(),
				datosdirecciones.getEstablecimiento(), datosdirecciones.getEscalera(), datosdirecciones.getPiso(),
				datosdirecciones.getLetra(), datosdirecciones.getCodigoPostal(), datosdirecciones.getIdProvincia(),
				datosdirecciones.getIdMunicipio(), datosdirecciones.getIdLocalidad(),
				datosdirecciones.getIdentificadorEstablecimiento(), datosdirecciones.getUsuarioUltmodificacion(),
				datosdirecciones.getComplementoDireccion(), getDatosTercerosIdTerceroAux,
				getTiposDireccionIdTipoDireccionAux);

		return datosdirecciones;
	}

	/**
	 * Updates a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	@Override
	public DatosDirecciones updateByIdDireccion(DatosDirecciones datosdirecciones) {
		String query = "UPDATE DATOS_DIRECCIONES SET  DIRECCION=?, NUMERO=?, ESTABLECIMIENTO=?, ESCALERA=?,   PISO=?,  LETRA=?,   CODIGO_POSTAL=?,   ID_PROVINCIA=?,  ID_MUNICIPIO=?,   ID_LOCALIDAD=?, IDENTIFICADOR_ESTABLECIMIENTO = ?,   FECHA_ULTMODIFICACION=sysdate,  USUARIO_ULTMODIFICACION=?, COMPLEMENTO_DIRECCION=?   WHERE ID_DIRECCION=?";

		this.jdbcTemplate.update(query, datosdirecciones.getDireccion(), datosdirecciones.getNumero(),
				datosdirecciones.getEstablecimiento(), datosdirecciones.getEscalera(), datosdirecciones.getPiso(),
				datosdirecciones.getLetra(), datosdirecciones.getCodigoPostal(), datosdirecciones.getIdProvincia(),
				datosdirecciones.getIdMunicipio(), datosdirecciones.getIdLocalidad(),
				datosdirecciones.getIdentificadorEstablecimiento(), datosdirecciones.getUsuarioUltmodificacion(),
				datosdirecciones.getComplementoDireccion(), datosdirecciones.getIdDireccion());

		return datosdirecciones;
	}

	/**
	 * Finds a single row in the DatosDirecciones table.
	 *
	 * @param datosdirecciones
	 *            DatosDirecciones
	 * @return DatosDirecciones
	 */
	@Override
	@Transactional(readOnly = true)
	public DatosDirecciones find(DatosDirecciones datosdirecciones) {
		String query = "SELECT t1.ID_DIRECCION IDDIRECCION, t1.ESTABLECIMIENTO ESTABLECIMIENTO, t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO, t1.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION, t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA, t1.PISO PISO, t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL, t1.ID_PROVINCIA IDPROVINCIA, t1.ID_MUNICIPIO IDMUNICIPIO, t1.ID_LOCALIDAD IDLOCALIDAD, t1.FECHA_REGISTRO FECHAREGISTRO, t1.USUARIO_REGISTRO USUARIOREGISTRO, t1.FECHA_ULTMODIFICACION FECHAULTMODIFICACION, t1.USUARIO_ULTMODIFICACION USUARIOULTMODIFICACION, t2.ID_TERCERO DATOSTERCEROSIDTERCERO, t2.DOCUMENTO DATOSTERCEROSDOCUMENTO, t2.ID_TIPO_DOCUMENTO DATOSTERCEROSIDTIPODOCUMENTO, t2.NOMBRE DATOSTERCEROSNOMBRE, t2.APELLIDO1 DATOSTERCEROSAPELLIDO1, t2.APELLIDO2 DATOSTERCEROSAPELLIDO2, t2.ID_SEXO DATOSTERCEROSIDSEXO, t2.TELEFONO DATOSTERCEROSTELEFONO, t2.EMAIL DATOSTERCEROSEMAIL, t2.IDIOMA DATOSTERCEROSIDIOMA, t2.TIPO_PARTICIPANTE DATOSTERCEROSTIPOPARTICIPANTE, t2.FECHA_REGISTRO DATOSTERCEROSFECHAREGISTRO, t2.USUARIO_REGISTRO DATOSTERCEROSUSUARIOREGISTRO, t2.FECHA_ULTMODIFICACION DATOSTERCEROSFECHAULTMODIF, t2.USUARIO_ULTMODIFICACION DATOSTERCEROSUSUARIOULTMODIF, t3.ID_TIPO_DIRECCION TIPOSDIRECCIONIDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO TIPOSDIRECCIONDESCRIPCIONES, t3.DESCRIPCION_EUSKERA TIPOSDIRECCIONDESCRIPCIONEU, t3.FECHA_REGISTRO TIPOSDIRECCIONFECHAREGISTRO, t3.USUARIO_REGISTRO TIPOSDIRECCIONUSUARIOREGISTRO, t2.ID_REPRESENTANTE DATOSTERCEROSIDREPRESENTANTE FROM DATOS_DIRECCIONES t1 , DATOS_TERCEROS t2 , TIPOS_DIRECCION t3  WHERE t1.ID_DIRECCION = ?   AND t1.ID_TERCERO= t2.ID_TERCERO(+) AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+)";

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMapFind,
				datosdirecciones.getIdDireccion());
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public DatosDirecciones buscarEstablecimiento(String numeroRegistro) {
		StringBuilder query = new StringBuilder();

		query.append("SELECT t1.NOMBRE_COMERCIAL ESTABLECIMIENTO, t6136.IDENTIFICADOR_ESTABLECIMIENTO IDENTESTABLECIMIENTO");
		query.append(
				", t6136.ID_DIRECCION IDDIRECCION, t6136.ID_TIPO_DIRECCION IDTIPODIRECCION, t6136.ID_PROVINCIA IDPROVINCIA");
		query.append(", t6136.ID_MUNICIPIO IDMUNICIPIO, t6136.ID_LOCALIDAD IDLOCALIDAD");
		query.append(", t6136.DIRECCION DIRECCION, t6136.NUMERO NUMERO, t6136.ESCALERA ESCALERA");
		query.append(
				", t6136.PISO PISO, t6136.LETRA LETRA, t6136.CODIGO_POSTAL CODIGOPOSTAL, t6136.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION");
		query.append(
				", t6136.DESCRIPCION_CIUDAD DESCRIPCIONCIUDAD, t6136.DESCRIPCION_PROVINCIA DESCRIPCIONPROVINCIA, t6136.ID_PAIS IDPAIS, t6136.ID_TERCERO IDTERCERO ");
		query.append(" FROM ESTABLECIMIENTOS_REGISTRADOS t1, REL_EST_DIR t2, DATOS_DIRECCIONES t6136");
		query.append(" WHERE t1.ID_ESTABLECIMIENTO = t2.ID_ESTABLECIMIENTO AND t2.ID_DIRECCION = t6136.ID_DIRECCION");
		query.append(" AND t6136.ID_TIPO_DIRECCION = ? AND t1.IDENTIFICADOR_ESTABLECIMIENTO = ?");

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query.toString(),
				this.rwMapDomicilioUbicacion, Constantes.ID_UBICACION_INVERSION, numeroRegistro);
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public DatosDirecciones findDomicilioUbicacion(Integer idExpediente, Long tipoDireccion) {
		StringBuilder query = new StringBuilder();

		query.append("SELECT t6136.ID_DIRECCION IDDIRECCION, t6136.ID_TIPO_DIRECCION IDTIPODIRECCION, ");
		query.append("t6136.ID_PROVINCIA IDPROVINCIA , ");
		query.append("t6136.ID_MUNICIPIO IDMUNICIPIO, t6136.ID_LOCALIDAD IDLOCALIDAD, ");
		query.append("t6136.DIRECCION DIRECCION ,t6136.NUMERO NUMERO, ");
		query.append("t6136.ESCALERA ESCALERA, t6136.PISO PISO, ");
		query.append("t6136.LETRA LETRA, t6136.CODIGO_POSTAL CODIGOPOSTAL, ");
		query.append(
				"t6136.ESTABLECIMIENTO ESTABLECIMIENTO, t6136.IDENTIFICADOR_ESTABLECIMIENTO IDENTESTABLECIMIENTO, t6136.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION, ");
		query.append(
				"t6136.DESCRIPCION_CIUDAD DESCRIPCIONCIUDAD, t6136.DESCRIPCION_PROVINCIA DESCRIPCIONPROVINCIA, t6136.ID_PAIS IDPAIS, t6136.ID_TERCERO IDTERCERO ");
		query.append("FROM DATOS_DIRECCIONES t6136, REL_EXP_DIR t6151 ");
		query.append("WHERE t6151.ID_DIRECCION = t6136.ID_DIRECCION AND t6151.ID_EXPEDIENTE  = ? ");

		List<DatosDirecciones> datosdireccionesList = new ArrayList<DatosDirecciones>();

		if (tipoDireccion != null) {
			query.append("AND t6136.ID_TIPO_DIRECCION = ? ");
			datosdireccionesList = this.jdbcTemplate.query(query.toString(), this.rwMapDomicilioUbicacion, idExpediente,
					tipoDireccion);
		} else {
			datosdireccionesList = this.jdbcTemplate.query(query.toString(), this.rwMapDomicilioUbicacion,
					idExpediente);
		}
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public DatosDirecciones findDomicilioUbicacionSinExpediente(Integer idInspeccion, Long tipoDireccion) {
		StringBuilder query = new StringBuilder();

		query.append("SELECT t6136.ID_DIRECCION IDDIRECCION, t6136.ID_TIPO_DIRECCION IDTIPODIRECCION, ");
		query.append("t6136.ID_PROVINCIA IDPROVINCIA , ");
		query.append("t6136.ID_MUNICIPIO IDMUNICIPIO, t6136.ID_LOCALIDAD IDLOCALIDAD, ");
		query.append("t6136.DIRECCION DIRECCION ,t6136.NUMERO NUMERO, ");
		query.append("t6136.ESCALERA ESCALERA, t6136.PISO PISO, ");
		query.append("t6136.LETRA LETRA, t6136.CODIGO_POSTAL CODIGOPOSTAL, ");
		query.append(
				"t6136.ESTABLECIMIENTO ESTABLECIMIENTO, t6136.IDENTIFICADOR_ESTABLECIMIENTO IDENTESTABLECIMIENTO, t6136.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION ");
		query.append(
				", t6136.DESCRIPCION_CIUDAD DESCRIPCIONCIUDAD, t6136.DESCRIPCION_PROVINCIA DESCRIPCIONPROVINCIA, t6136.ID_PAIS IDPAIS, t6136.ID_TERCERO IDTERCERO ");
		query.append("FROM DATOS_DIRECCIONES t6136, REL_EST_INS t7922 ");
		query.append("WHERE t7922.ID_DIRECCION = t6136.ID_DIRECCION AND t7922.ID_INSPECCION = ? ");

		List<DatosDirecciones> datosdireccionesList = new ArrayList<DatosDirecciones>();

		if (tipoDireccion != null) {
			query.append("AND t6136.ID_TIPO_DIRECCION = ? ");
			datosdireccionesList = this.jdbcTemplate.query(query.toString(), this.rwMapDomicilioUbicacion, idInspeccion,
					tipoDireccion);
		} else {
			datosdireccionesList = this.jdbcTemplate.query(query.toString(), this.rwMapDomicilioUbicacion,
					idInspeccion);
		}

		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public List<Ubicacion> findUbicacionesREST(Integer idExpediente, Integer idInspeccion) {
		String query = "";
		List<Ubicacion> ubicacionList = new ArrayList<Ubicacion>();
		if (idExpediente != null) {
			query = "SELECT t1.id_tipo_direccion idtipodireccion, t1.identificador_establecimiento identificadorestablecimiento, t1.establecimiento establecimiento, t1.direccion direccion, t1.numero numero, t1.escalera escalera, t1.piso piso, t1.letra letra, t1.codigo_postal codigopostal, t1.id_provincia idprovincia, t1.id_municipio idmunicipio, t1.id_localidad idlocalidad FROM datos_direcciones t1, rel_exp_dir t2 WHERE t1.id_direccion = t2.id_direccion AND t2.id_expediente = ? ";
			ubicacionList = this.jdbcTemplate.query(query, this.rwMapUbicacion, idExpediente);
		} else {
			query = "SELECT t1.id_tipo_direccion idtipodireccion, t1.identificador_establecimiento identificadorestablecimiento, t1.establecimiento establecimiento, t1.direccion direccion, t1.numero numero, t1.escalera escalera, t1.piso piso, t1.letra letra, t1.codigo_postal codigopostal, t1.id_provincia idprovincia, t1.id_municipio idmunicipio, t1.id_localidad idlocalidad FROM datos_direcciones t1, rel_est_ins t2 WHERE t1.id_direccion = t2.id_direccion AND t2.id_inspeccion = ? ";
			ubicacionList = this.jdbcTemplate.query(query, this.rwMapUbicacion, idInspeccion);
		}

		return ubicacionList;
	}

	@Override
	public DatosDirecciones findIdEstablecimientoByIdInspeccion(Integer idInspeccion) {
		String query = "SELECT t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO FROM DATOS_DIRECCIONES t1, REL_EXP_DIR t2, INSPECCIONES t3 WHERE t2.ID_EXPEDIENTE = t3.ID_EXPEDIENTE AND t2.ID_DIRECCION = t1.ID_DIRECCION AND t1.ID_TIPO_DIRECCION = "
				+ Constantes.ID_UBICACION_INVERSION + " AND t3.ID_INSPECCION = ?";

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMapFindIdEstablecimiento,
				idInspeccion);
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	/**
	 * Finds las ubicaciones del terceros solicitante
	 *
	 * @param idTercero
	 *            Integer
	 * @return DatosDirecciones
	 */
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findUbicacionTerceroId(Integer idTercero) {
		StringBuilder query = new StringBuilder();

		query.append(
				"SELECT t1.ID_DIRECCION IDDIRECCION, t1.ID_TERCERO IDTERCERO,  t1.ESTABLECIMIENTO ESTABLECIMIENTO,  t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA");
		query.append(
				", t1.PISO PISO,  t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL,  t1.ID_PROVINCIA IDPROVINCIA,  t1.ID_MUNICIPIO IDMUNICIPIO");
		query.append(
				", t1.ID_LOCALIDAD IDLOCALIDAD,t3.ID_TIPO_DIRECCION IDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO DESCASTELLANO");
		query.append(
				",  t3.DESCRIPCION_EUSKERA DESEUSKERA, t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO, t1.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION, t1.ID_PAIS IDPAIS");

		query.append(" FROM  DATOS_DIRECCIONES t1 ,  TIPOS_DIRECCION t3");

		query.append(" WHERE t1.ID_TERCERO = ?  AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+)");

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query.toString(),
				this.rwMapUbicacionTerceroId, idTercero);
		return datosdireccionesList;
	}

	/**
	 * Finds la dirección por la relación con la inspección
	 *
	 * @param idTercero
	 *            Integer
	 * @return DatosDirecciones
	 */
	@Override
	@Transactional(readOnly = true)
	public List<DatosDirecciones> findByRelEstIns(Integer idInspeccion) {
		StringBuilder query = new StringBuilder();

		query.append(
				"SELECT t1.ID_DIRECCION IDDIRECCION, t1.ID_TERCERO IDTERCERO,  t1.ESTABLECIMIENTO ESTABLECIMIENTO,  t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA");
		query.append(
				", t1.PISO PISO,  t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL,  t1.ID_PROVINCIA IDPROVINCIA,  t1.ID_MUNICIPIO IDMUNICIPIO");
		query.append(
				", t1.ID_LOCALIDAD IDLOCALIDAD,t3.ID_TIPO_DIRECCION IDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO DESCASTELLANO");
		query.append(
				",  t3.DESCRIPCION_EUSKERA DESEUSKERA, t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO, t1.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION, t1.ID_PAIS IDPAIS");

		query.append(" FROM  DATOS_DIRECCIONES t1, REL_EST_INS t2, TIPOS_DIRECCION t3");

		query.append(" WHERE t2.ID_INSPECCION = ? AND t1.ID_DIRECCION = t2.ID_DIRECCION AND t1.ID_TIPO_DIRECCION = "
				+ Constantes.ID_UBICACION_INVERSION + "  AND t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION");

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query.toString(),
				this.rwMapUbicacionTerceroId, idInspeccion);
		return datosdireccionesList;
	}

	@Override
	public Ubicacion findUbicacionPostalByIdTercero(Integer idTercero) {
		StringBuilder query = new StringBuilder(
				"SELECT t1.id_tipo_direccion idtipodireccion, t1.identificador_establecimiento identificadorestablecimiento, t1.establecimiento establecimiento, t1.direccion direccion, t1.numero numero, t1.escalera escalera, t1.piso piso, t1.letra letra, t1.codigo_postal codigopostal, t1.id_provincia idprovincia, t1.id_municipio idmunicipio, t1.id_localidad idlocalidad FROM datos_direcciones t1 WHERE t1.id_tercero = ? AND t1.id_tipo_direccion = "
						+ Constantes.ID_DIRECCION_POSTAL);

		List<Ubicacion> ubicacionList = this.jdbcTemplate.query(query.toString(), this.rwMapUbicacion, idTercero);

		return DataAccessUtils.uniqueResult(ubicacionList);
	}

	/**
	 * Finds las ubicaciones del terceros solicitante, segÃºn el tipo de
	 * participante
	 *
	 * @param idTercero
	 *            Integer
	 * @param idTipoDireccion
	 *            Integer
	 * 
	 * @return DatosDirecciones
	 */
	@Override
	@Transactional(readOnly = true)
	public DatosDirecciones findUbicacionTerceroIdTipo(Integer idTercero, Integer idTipoDireccion) {
		StringBuilder query = new StringBuilder();
		List<Object> params = new ArrayList<Object>();

		query.append(
				"SELECT t1.ID_DIRECCION IDDIRECCION, t1.ID_TERCERO IDTERCERO,  t1.ESTABLECIMIENTO ESTABLECIMIENTO,  t1.DIRECCION DIRECCION, t1.NUMERO NUMERO, t1.ESCALERA ESCALERA");
		query.append(
				", t1.PISO PISO,  t1.LETRA LETRA, t1.CODIGO_POSTAL CODIGOPOSTAL,  t1.ID_PROVINCIA IDPROVINCIA,  t1.ID_MUNICIPIO IDMUNICIPIO");
		query.append(
				", t1.ID_LOCALIDAD IDLOCALIDAD,t3.ID_TIPO_DIRECCION IDTIPODIRECCION, t3.DESCRIPCION_CASTELLANO DESCASTELLANO");
		query.append(
				",  t3.DESCRIPCION_EUSKERA DESEUSKERA, t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO, t1.COMPLEMENTO_DIRECCION COMPLEMENTODIRECCION, t1.ID_PAIS IDPAIS");

		query.append(" FROM  DATOS_DIRECCIONES t1 ,  TIPOS_DIRECCION t3");

		query.append(" WHERE t1.ID_TIPO_DIRECCION= t3.ID_TIPO_DIRECCION(+)");
		query.append(" AND t1.ID_TERCERO = ?");
		params.add(idTercero);
		query.append(" AND t1.ID_TIPO_DIRECCION = ?");
		params.add(idTipoDireccion);

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query.toString(),
				this.rwMapUbicacionTerceroId, params.toArray());

		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public DatosDirecciones findIdEstablecimiento(Integer idExpediente) {
		String query = "SELECT t6136.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO FROM DATOS_DIRECCIONES t6136, REL_EXP_DIR t6151 WHERE t6136.ID_TIPO_DIRECCION = ? AND t6136.ID_DIRECCION = t6151.ID_DIRECCION AND t6151.ID_EXPEDIENTE = ?";

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMapFindIdEstablecimiento,
				Constantes.ID_UBICACION_INVERSION, idExpediente);
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public DatosDirecciones findIdEstablecimientoByRelEstIns(Inspecciones inspeccion) {
		String query = "SELECT t1.IDENTIFICADOR_ESTABLECIMIENTO IDENTIFICADORESTABLECIMIENTO FROM DATOS_DIRECCIONES t1, DATOS_TERCEROS t2 WHERE t1.ID_TERCERO = t2.ID_TERCERO AND t1.ID_TIPO_DIRECCION = "
				+ Constantes.ID_UBICACION_INVERSION
				+ " AND t2.ID_TERCERO IN (SELECT t3.ID_TERCERO FROM REL_EST_INS t3 WHERE t3.ID_INSPECCION = ?) AND t2.TIPO_PARTICIPANTE = "
				+ Constantes.PARTICIPANTE_TITULAR;

		List<DatosDirecciones> datosdireccionesList = this.jdbcTemplate.query(query, this.rwMapFindIdEstablecimiento,
				inspeccion.getIdInspeccion());
		return DataAccessUtils.uniqueResult(datosdireccionesList);
	}

	@Override
	public void eliminarTercero(DatosTerceros datosTercero) {
		String query = "UPDATE DATOS_DIRECCIONES SET ID_TERCERO = NULL WHERE ID_TERCERO = ?";

		this.jdbcTemplate.update(query, datosTercero.getIdTercero());
	}

	/*
	 * MÃƒâ€°TODOS PRIVADOS
	 */

	// CHECKSTYLE:ON CyclomaticComplexity - GeneraciÃƒÂ³n de cÃƒÂ³digo de UDA

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