package com.ejie.m62fb.dao.registroVPP;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import javax.annotation.Resource;
import javax.sql.DataSource;

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.utils.memory.ListUtils;
import com.ejie.m62fb.dao.registroVPP.plsql.M62FuncionesPLSQL;
import com.ejie.m62fb.model.InquilinoAd;
import com.ejie.m62fb.model.documento.DocumentoRegVPP;
import com.ejie.m62fb.model.tipos.TipoAcceso;
import com.ejie.m62fb.model.tipos.TipoPropietarios;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.sql.BDUtils;

/**
 * CargaFicherosDaoImpl.
 * 
XXXX
 */
@Repository
@Transactional
public class CargaFicherosDaoImpl implements CargaFicherosDao {
	private JdbcTemplate jdbcTemplate;
	/*
	 * ROW_MAPPERS
	 */
	private final RowMapper<String> rwMapTiposExpediente = new RowMapper<String>() {
		@Override
		public String mapRow(ResultSet resultSet, int rowNum)
				throws SQLException {
			return resultSet.getString("COD_TIPO_EXPED");
		}
	};
	private final RowMapper<String> rwMapVersionFicheros= new RowMapper<String>() {
		@Override
		public String mapRow(ResultSet resultSet, int rowNum)
				throws SQLException {
			return resultSet.getString("NUM_VERSION");
		}
	};

	/**
	 * Method use to set the datasource.
	 * 
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}
	@Override
	public String tiposDeExpedienteValidos(int tipoFichero) {
		StringBuilder query= new StringBuilder();
		
		switch (tipoFichero){
			case AppConstantes.COMUNICACION_VPP_AYUNTAMIENTOS:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_VALIDAR_EXP_COMU_VPP_AYTO);
				break;
			}
			case AppConstantes.CONTRATOS_SOLICITUD_CALIFICACION_PROVISIONAL_DEFINITIVA:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_VALIDAR_EXP_CONTRATO_SOLIC_CALIF);
				break;
			}
			case AppConstantes.CONTRATOS_COMUNICACION_ALOJAMIENTOS_DOTACIONALES:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_VALIDAR_EXP_CONTRATO_ALOJ_DOTAC);
				break;
			}
		}

		List<String> listaExpedientes = this.jdbcTemplate.query(query.toString(), this.rwMapTiposExpediente);
		return ListUtils.listaToCadenaConSeparador(listaExpedientes, ListUtils.SEPARADOR_COMA);
	}
	@Override
	public String getVersionFichero(int tipoFichero){
		StringBuilder query= new StringBuilder();
		switch (tipoFichero){
			case AppConstantes.COMUNICACION_VPP_AYUNTAMIENTOS:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_GET_VERSION_FICH_CONT_VPP_AYTO);
				break;
			}
			case AppConstantes.CONTRATOS_SOLICITUD_CALIFICACION_PROVISIONAL_DEFINITIVA:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_GET_VERSION_FICH_SOLIC_CALIF_PROV);
				break;
			}
			case AppConstantes.CONTRATOS_COMUNICACION_ALOJAMIENTOS_DOTACIONALES:{
				query=new StringBuilder(CargaFicherosDaoSql.SQL_SELECT_GET_VERSION_FICH_CONT_ALOJ_DOTAC);
				break;
			}
		}
		return this.jdbcTemplate.queryForObject(query.toString(),rwMapVersionFicheros);
	}
	@Override
	public void borrarViviendas(String numExpediente){
		//borrar viviendas del expediente relacionado
		StringBuilder query=new StringBuilder(CargaFicherosDaoSql.SQL_DELETE_ELEMENTOS_REL_EXPED);
		this.jdbcTemplate.update(query.toString(), numExpediente.substring(0,15).toUpperCase()	+ "%");
		query=new StringBuilder(CargaFicherosDaoSql.SQL_DELETE_VIVIENDAS_REL_EXPED);
		this.jdbcTemplate.update(query.toString(), numExpediente.substring(0,15).toUpperCase()	+ "%");
	}

    public TipoPropietarios getNumTipoPropietarios(String nifSolicitante) {
		/*****
		 * Llamada a function que implementa llamada a plsql
		 ****/
		M62FuncionesPLSQL m62FuncionesPLSQL = new M62FuncionesPLSQL(
				this.jdbcTemplate.getDataSource());
		
		return m62FuncionesPLSQL.getNumTipoPropietarios( nifSolicitante);
    }
    public TipoAcceso getNumTipoRegAcceso(String codRegAcceso,String regTenencia) {
		/*****
		 * Llamada a function que implementa llamada a plsql
		 ****/
		M62FuncionesPLSQL m62FuncionesPLSQL = new M62FuncionesPLSQL(
				this.jdbcTemplate.getDataSource());
		
		return m62FuncionesPLSQL.getNumTipoRegAcceso( codRegAcceso,regTenencia);
    }
}