package com.ejie.m62fb.dao.registroVPP;

import java.math.BigDecimal;
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.beans.factory.annotation.Autowired;
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.dao.SQLGenericas;
import com.ejie.m62fb.model.ExpedienteVivienda;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.constants.BDConstantes;

/**
 * ExpedienteViviendaDaoImpl.
 * 
XXXX
 */
@Repository
@Transactional
public class ExpedienteViviendaDaoImpl implements ExpedienteViviendaDao {
	private JdbcTemplate jdbcTemplate;

	@Autowired
	DireccionesDao direccionesDao;

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

			// Num. Expediente
			expedienteVivienda.setNumExpediente(resultSet
					.getString("NUMEXPEDIENTE"));

			return expedienteVivienda;
		}
	};
	/*
	 * ROW_MAPPERS
	 */
	private final RowMapper<BigDecimal> rwMapNumVivienda = new RowMapper<BigDecimal>() {
		@Override
		public BigDecimal mapRow(ResultSet resultSet, int rowNum)
				throws SQLException {

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

	/**
	 * Devuelve el numero de Expediente de la tabla M62R02S00 (buscamos por
	 * NUM_VIVIENDA y obtenemos el primer registro con mayor NUM_ORDEN)
	 * 
	 * @param idVivienda
	 *            Integer
	 * @return ExpedienteVivienda
	 */
	@Override
	@Transactional(readOnly = true)
	public ExpedienteVivienda findExpedienteVivienda(Integer idVivienda) {
		String query = "SELECT t1.NUM_EXPEDIENTE NUMEXPEDIENTE FROM EXPEDIENTE_VIVIENDA t1 WHERE t1.NUM_VIVIENDA = "
				+ idVivienda + " AND NUM_ORDEN =1";

		List<ExpedienteVivienda> expedienteViviendaList = this.jdbcTemplate
				.query(query, this.rwMap);

		// Si la lista tiene datos, cogemos el primer registro
		if (!expedienteViviendaList.isEmpty()) {
			return expedienteViviendaList.get(0);
		} else {
			return null;
		}
	}
	/**
	 * Devuelve el numero de vivienda de la tabla M62R02S00 (buscamos por
	 * NUM_EXPEDIENTE y obtenemos el primer registro con mayor NUM_ORDEN)
	 * 
	 * @param numExpedienteVivienda
	 *            String
	 * @return BigDecimal
	 */
	@Override
	@Transactional(readOnly = true)
	public BigDecimal findIdVivienda(String numExpedienteVivienda) {
		String query = "SELECT EV.NUM_VIVIENDA FROM EXPEDIENTE_VIVIENDA EV,VIVIENDA V WHERE EV.NUM_EXPEDIENTE = '"
				+numExpedienteVivienda + "' AND EV.NUM_VIVIENDA = V.NUM_VIVIENDA ORDER BY NUM_ORDEN DESC";


		List<BigDecimal> expedienteViviendaList = this.jdbcTemplate
				.query(query,rwMapNumVivienda);

		// Si la lista tiene datos, cogemos el primer registro
		if (!expedienteViviendaList.isEmpty()) {
			return expedienteViviendaList.get(0);
		} else {
			return null;
		}
	}
	 /* Devuelve el numero de vivienda de la tabla M62R02S00 (buscamos por
			 * NUM_EXPEDIENTE y obtenemos el primer registro con mayor NUM_ORDEN)
			 * 
			 * @param numExpedienteVivienda
			 *            String
			 * @return BigDecimal
			 */
			@Override
			@Transactional(readOnly = true)
			public void inserRelacExpedVivienda(BigDecimal numVivienda,String numExpediente,String codTipoExped) {
				String query = "INSERT INTO " + BDConstantes.EXPEDIENTE_VIVIENDA+" (NUM_VIVIENDA,NUM_EXPEDIENTE,NUM_ORDEN," +
						"COD_TIPO_FIGURA,COD_TIPO_AYUDA,COD_TIPO_EXPED"+ 
						SQLGenericas.INSERT_ABSTRACT_CLASS_SQL + ") "+
						"VALUES(?,?,1,'A'," +
						"(SELECT COD_TIPO_AYUDA FROM "+ BDConstantes.TIPO_EXPEDIENTE+" WHERE COD_TIPO_FIGURA ='A' AND COD_TIPO_EXPED=?),?"+ 
						SQLGenericas.INSERT_ABSTRACT_CLASS_QUESTION_TAGS + ")";

				// Campos para la generación de un elemento
				// Preparar Parametros
				List<Object> params = new ArrayList<Object>();
				params.add(numVivienda);
				params.add(numExpediente);
				params.add(codTipoExped);
				params.add(codTipoExped);
				// SQLGenericas.ABSTRACT_CLASS_SQL
				SQLGenericas.getParamsAbstractClass(params, null);
				this.jdbcTemplate.update(query, params.toArray());
			}
	// CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA

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