package com.ejie.m62fb.dao.registroVPP;

import java.sql.ResultSet;
import java.sql.SQLException;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.m62fb.model.direccion.Direccion;
import com.ejie.m62fb.utils.sql.BDUtils;
import com.ejie.m62fb.utils.sql.Utilidades;
import com.ejie.m62fb.utils.sql.UtilsResulSet;
import com.ejie.t17i.dao.CalleDao;
import com.ejie.t17i.dao.LocalidadDao;
import com.ejie.t17i.dao.MunicipioDao;
import com.ejie.t17i.dao.PaisDao;
import com.ejie.t17i.dao.ProvinciaDao;
import com.ejie.t17i.model.Calle;
import com.ejie.t17i.model.Localidad;
import com.ejie.t17i.model.Municipio;
import com.ejie.t17i.model.Pais;
import com.ejie.t17i.model.Planta;
import com.ejie.t17i.model.Portal;
import com.ejie.t17i.model.Provincia;

/**
 * DireccionesDaoImpl
 * 
XXXX
 */

@Repository
@Transactional
public class DireccionesDaoImpl implements DireccionesDao {

	@Autowired
	private PaisDao paisDao;
	@Autowired
	private ProvinciaDao provinciaDao;
	@Autowired
	private MunicipioDao municipioDao;
	@Autowired
	private LocalidadDao localidadDao;
	@Autowired
	private CalleDao calleDao;
	// @Autowired
	// private PortalDao portalDao;
	// @Autowired
	// private PlantaDao plantaDao;

	private JdbcTemplate jdbcTemplate;

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

	/**
	 * Crea una Direcci&oacute;n
	 * 
	 * @param resultSet
	 *            ResultSet
	 * @return Direccion
	 * @throws SQLException
	 */
	@Override
	@Deprecated
	@Transactional(readOnly = true)
	public Direccion createFromResultSet(ResultSet resultSet)
			throws SQLException {

		Direccion direccion = new Direccion();
		// PAIS
		direccion
				.setPais(UtilsResulSet.getString(resultSet, BDUtils.PAIS) != null ? paisDao
						.find(new Pais(resultSet.getString(BDUtils.PAIS)))
						: null);
		// PROVINCIA
		direccion.setProvincia(UtilsResulSet.getString(resultSet,
				BDUtils.PROVINCIA) != null ? provinciaDao.find(new Provincia(
				UtilsResulSet.getString(resultSet, BDUtils.PROVINCIA))) : null);
		// MUNICIPIO
		direccion.setMunicipio(UtilsResulSet.getString(resultSet,
				BDUtils.MUNICIPIO) != null ? municipioDao.find(new Municipio(
				UtilsResulSet.getString(resultSet, BDUtils.MUNICIPIO),
				direccion.getProvincia())) : null);
		// LOCALIDAD
		direccion.setLocalidad(UtilsResulSet.getBigDecimal(resultSet,
				BDUtils.LOCALIDAD) != null ? localidadDao.find(new Localidad(
				UtilsResulSet.getBigDecimal(resultSet, BDUtils.LOCALIDAD)))
				: null);
		// CALLE
		direccion.setCalle(UtilsResulSet
				.getBigDecimal(resultSet, BDUtils.CALLE) != null ? calleDao
				.find(new Calle(UtilsResulSet.getBigDecimal(resultSet,
						BDUtils.CALLE))) : null);
		// PORTAL
		Portal portal = new Portal();
		portal.setBloque(UtilsResulSet.getString(resultSet, BDUtils.BLOQUE));
		portal.setNumero(UtilsResulSet.getString(resultSet, BDUtils.NUMERO));
		portal.setBis(UtilsResulSet.getString(resultSet, BDUtils.BIS));
		portal.setCodigoPostal(UtilsResulSet.getString(resultSet,
				BDUtils.CODIGO_POSTAL));
		direccion.setPortal(portal);
		// PLANTA
		Planta planta = new Planta();
		planta.setEscalera(UtilsResulSet.getString(resultSet, BDUtils.ESCALERA));
		planta.setPiso(UtilsResulSet.getString(resultSet, BDUtils.PISO));
		direccion.setPlanta(planta);
		// MANO
		direccion.setMano(UtilsResulSet.getString(resultSet, BDUtils.MANO));
		// PUERTA
		direccion.setPuerta(UtilsResulSet.getString(resultSet, BDUtils.PUERTA));
		return direccion;
	}

	/**
	 * Compelta la direccion pasada con sus descripciones
	 * 
	 * @param direccion
	 *            Direccion
	 * 
	 * @return Direccion
	 * 
	 * @throws SQLException
	 */
	@Override
	@Transactional(readOnly = true)
	public Direccion completarDireccion(Direccion direccion)
			throws SQLException {

		if (direccion != null) {
			// Pais
			if (direccion.getPais() != null
					&& !Utilidades.isEmpty(direccion.getPais().getId())) {
				direccion.setPais(paisDao.find(direccion.getPais()));
			}else{
				direccion.setPais(new Pais());
			}
			
			// Provincia
			if (direccion.getProvincia() != null
					&& !Utilidades.isEmpty(direccion.getProvincia().getId())) {
				direccion.setProvincia(provinciaDao.find(direccion
						.getProvincia()));
			}else{
				direccion.setProvincia(new Provincia());
			}
			
			// Municipio
			if (direccion.getMunicipio() != null
					&& !Utilidades.isEmpty(direccion.getMunicipio().getId())) {
				direccion.setMunicipio(municipioDao.find(direccion
						.getMunicipio()));
			}else{
				direccion.setMunicipio(new Municipio());
			}
			// Localidad
			if (direccion.getLocalidad() != null
					&& direccion.getLocalidad().getId() != null) {
				direccion.setLocalidad(localidadDao.find(direccion
						.getLocalidad()));
			}else{
				direccion.setLocalidad(new Localidad());
			}
			// Calle
			if (direccion.getCalle() != null
					&& direccion.getCalle().getId() != null) {
				direccion.setCalle(calleDao.find(direccion.getCalle()));
			}else{
				direccion.setCalle(new Calle());
			}
		}

		return direccion;
	}
}
