package com.ejie.ab79.dao.plantillas;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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.ab79.model.plantillas.TiposPlantilla;

/**
 * TiposPlantillaDaoImpl  
 *  
 */

@Repository
@Transactional
public class TiposPlantillaDaoImpl implements TiposPlantillaDao {


    public static final String[] ORDER_BY_WHITE_LIST = new String[] {"IDTIPOPLANTILLA", "DESCRIPCIONCASTELLANO", "DESCRIPCIONEUSKERA", "FECHAREGISTRO", "USUARIOREGISTRO", "TASKID", "PROCEEDINGID", "TITLE", "DOCUMENTROLEID", "DOCUMENTROLENAMEEUS", "DOCUMENTROLENAMECAS", "FECHAULTMODIFICACION", "USUARIOULTMODIFICACION", "TASKTYPE", "TIPO"};

    private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<TiposPlantilla> rwMap = new RowMapper<TiposPlantilla>() {
		public TiposPlantilla mapRow(ResultSet resultSet, int rowNum) throws SQLException {
           TiposPlantilla tiposPlantilla = new TiposPlantilla();
           tiposPlantilla.setIdTipoPlantilla(resultSet.getLong("IDTIPOPLANTILLA"));
           tiposPlantilla.setDescripcionCastellano(resultSet.getString("DESCRIPCIONCASTELLANO"));
           tiposPlantilla.setDescripcionEuskera(resultSet.getString("DESCRIPCIONEUSKERA"));
           tiposPlantilla.setTipo(resultSet.getInt("TIPO"));
           
           return tiposPlantilla;
        } 
	};


	/**
     * 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 TiposPlantilla table.
    *
    * @param tiposplantilla TiposPlantilla
    * @param tableRequestDto TableRequestDto
    * @return List<TiposPlantilla>
    */
	@Transactional (readOnly = true)
    public List<TiposPlantilla> findAll(TiposPlantilla tiposplantilla) {
		StringBuilder query = new StringBuilder("SELECT  t1.ID_TIPO_PLANTILLA IDTIPOPLANTILLA,t1.DESCRIPCION_CASTELLANO DESCRIPCIONCASTELLANO,t1.DESCRIPCION_EUSKERA DESCRIPCIONEUSKERA,t1.TIPO TIPO ");
		query.append("FROM TIPOS_PLANTILLA t1 ");

		//Where clause & Params
		Map<String, ?> mapaWhere = this.getWhereMap(tiposplantilla); 
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");

		return (List<TiposPlantilla>) this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
	}

	/*
	 * MÉTODOS PRIVADOS
	 */

	/**
	 * Returns a map with the needed value to create the conditions to filter by
	 * the TiposPlantilla entity
	 *
	 * @param tiposplantilla TiposPlantilla
	 *            Bean with the criteria values to filter by.
	 * @return Map created with two keys
	 *         key query stores the sql query syntax
	 *         key params stores the parameter values to be used in the condition sentence.
	 */
	// CHECKSTYLE:OFF CyclomaticComplexity - Generación de código de UDA
	private Map<String, ?> getWhereMap (TiposPlantilla tiposplantilla){

		StringBuilder where = new StringBuilder(TiposPlantillaDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (tiposplantilla  != null  && tiposplantilla.getIdTipoPlantilla() != null ) {
			where.append(" AND t1.ID_TIPO_PLANTILLA = ?");
			params.add(tiposplantilla.getIdTipoPlantilla());
		}
		if (tiposplantilla  != null  && tiposplantilla.getDescripcionCastellano() != null ) {
			where.append(" AND t1.DESCRIPCION_CASTELLANO = ?");
			params.add(tiposplantilla.getDescripcionCastellano());
		}
		if (tiposplantilla  != null  && tiposplantilla.getDescripcionEuskera() != null ) {
			where.append(" AND t1.DESCRIPCION_EUSKERA = ?");
			params.add(tiposplantilla.getDescripcionEuskera());
		}
		if (tiposplantilla  != null  && tiposplantilla.getTipo() != null ) {
			where.append(" AND t1.TIPO = ?");
			params.add(tiposplantilla.getTipo());
		}

		Map<String,Object> mapWhere = new HashMap<String, Object>();
		mapWhere.put("query", where);
		mapWhere.put("params", params);

		return mapWhere;
	}

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

}

