package com.ejie.ab61.dao.serviciosWeb;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Locale;

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
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.ab61.model.toolkit.ValorBusquedas;
import com.ejie.ab61.model.toolkit.ValorComboToolkit;

/**
 * ValorComboToolkitDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class ServiciosWebDaoImpl implements ServiciosWebDao {

	private static final Logger logger = LoggerFactory.getLogger(ServiciosWebDaoImpl.class);
	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDRELEXPACTSUB", "DESCRIPCIONCASTELLANO",
			"DESCRIPCIONEUSKERA" };

	@Resource
	ReloadableResourceBundleMessageSource appMessageSource;

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<ValorComboToolkit> rwMap = new RowMapper<ValorComboToolkit>() {
		public ValorComboToolkit mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new ValorComboToolkit(resultSet.getString("VALOR"), resultSet.getString("DESCRIPCIONCASTELLANO"),
					resultSet.getString("DESCRIPCIONEUSKERA"));
		}
	};
	private RowMapper<ValorBusquedas> rwMapBusquedas = new RowMapper<ValorBusquedas>() {
		public ValorBusquedas mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new ValorBusquedas(resultSet.getString("VALOR"));
		}
	};

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

	/**
	 * Finds a list of rows in the V_ACTUACIONES_SUBVENCIONABLES table.
	 *
	 * @param folder_number
	 *            String
	 * 
	 * @return List<ValorComboToolkit>
	 */
	@Transactional(readOnly = true)
	public List<ValorComboToolkit> findDataForToolkit(String parametroEntrada, String nombre_vista) {

		ServiciosWebDaoImpl.logger.info(
				"[GET - findDataForToolkit] : Obtener lista de datos para el parametroEntrada: " + parametroEntrada);

		String query = "SELECT  T1.VALOR VALOR,  T1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,  T1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA "
				+ "FROM  " + nombre_vista + " T1 WHERE T1.PARAMETRO = ?";

		ServiciosWebDaoImpl.logger.info("[QUERY] : Obtener lista de datos : " + query);
		List<ValorComboToolkit> resultado = new java.util.ArrayList<ValorComboToolkit>();
		try {
			resultado = (List<ValorComboToolkit>) this.jdbcTemplate.query(query, this.rwMap, parametroEntrada);

		} catch (Exception e) {
			ServiciosWebDaoImpl.logger
					.error("La vista " + nombre_vista + " introducida en el webService no existe en la base de datos");
		} finally {
			if (resultado.isEmpty()) {
				ValorComboToolkit valorVacio = new ValorComboToolkit();
				valorVacio.setCodigo("VACIO");
				valorVacio.setDescripcionCas(appMessageSource.getMessage("noDatos", null, new Locale("es")));
				valorVacio.setDescripcionEus(appMessageSource.getMessage("noDatos", null, new Locale("eu")));

				resultado.add(valorVacio);
			}

		}
		return resultado;
	}

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

	@Transactional(readOnly = true)
	public List<ValorBusquedas> ejecutarSQLBusqueda(String sql) {
		List<ValorBusquedas> result = this.jdbcTemplate.query(sql, this.rwMapBusquedas);
		return result;
	}
}
