package com.ejie.ab63.comun.utilidades;

import java.math.BigDecimal;

import org.springframework.jdbc.core.JdbcTemplate;

import com.ejie.ab63.comun.Constantes;

/**
 * Contiene todas las secuencias de la aplicacion, y los metodos para
 * interactuar con ellas
 * 
 *  
 */
public class SecuenciasSQL {

	private String codSecuencia;

	/**
	 * Constructor privado de secuencia
	 * 
	 * @param codSecuencia
	 *            String
	 */
	private SecuenciasSQL(String codSecuencia) {
		this.codSecuencia = codSecuencia;
	}

	/**
	 * Recupera el siguiente valor de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return Long
	 */
	public Long getNextLong(JdbcTemplate jdbcTemplate) {
		return jdbcTemplate.queryForLong(SecuenciasSQL.getSelectNext(this.codSecuencia));
	}

	/**
	 * Recupera el siguiente valor de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return Integer
	 */
	public Integer getNextInteger(JdbcTemplate jdbcTemplate) {
		return jdbcTemplate.queryForInt(SecuenciasSQL.getSelectNext(this.codSecuencia));
	}

	/**
	 * Recupera el siguiente valor de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return BigDecimal
	 */
	public BigDecimal getNextBigDecimal(JdbcTemplate jdbcTemplate) {

		Long lngSecuencia = jdbcTemplate.queryForLong(SecuenciasSQL.getSelectNext(this.codSecuencia));

		BigDecimal bgSecuencia = new BigDecimal(lngSecuencia);

		return bgSecuencia;
	}

	/**
	 * Recupera el valor actual de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return Long
	 */
	public Long getCurrentLong(JdbcTemplate jdbcTemplate) {
		return jdbcTemplate.queryForLong(SecuenciasSQL.getSelectCurrent(this.codSecuencia));
	}

	/**
	 * Recupera el valor actual de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return Integer
	 */
	public Integer getCurrentInteger(JdbcTemplate jdbcTemplate) {
		return jdbcTemplate.queryForInt(SecuenciasSQL.getSelectCurrent(this.codSecuencia));
	}

	/**
	 * Recupera el valor actual de la secuencia. Es necesario informar la
	 * plantilla jdbc para tratar con BBDD.
	 * 
	 * @param jdbcTemplate
	 *            JdbcTemplate
	 * @return BigDecimal
	 */
	public BigDecimal getCurrentBigDecimal(JdbcTemplate jdbcTemplate) {

		Long lngSecuencia = jdbcTemplate.queryForLong(SecuenciasSQL.getSelectCurrent(this.codSecuencia));
		BigDecimal bgSecuencia = new BigDecimal(lngSecuencia);

		return bgSecuencia;
	}

	/**
	 * Devuelve la operacion que se puede incluir dentro de una sentencia
	 * 'insert' o 'update'.
	 * 
	 * @return String
	 */
	public String getEmbbedNextVal() {
		StringBuffer query = new StringBuffer();
		query.append(this.codSecuencia).append(".NEXTVAL ");
		return query.toString();
	}

	/**
	 * Devuelve la select que recupera el siguiente valor de la secuencia
	 * 
	 * @param secuencia
	 *            String
	 * @return String
	 */
	public static String getSelectNext(String secuencia) {

		StringBuffer query = new StringBuffer(Constantes.STRING_BUILDER_INIT);
		query.append("SELECT ");
		query.append(secuencia);
		query.append(".NEXTVAL FROM DUAL ");
		return query.toString();
	}

	/**
	 * Devuelve la select que recupera el valor actual de la secuencia
	 * 
	 * @param secuencia
	 *            String
	 * @return String
	 */
	public static String getSelectCurrent(String secuencia) {

		StringBuffer query = new StringBuffer(Constantes.STRING_BUILDER_INIT);
		query.append("SELECT ");
		query.append(secuencia);
		query.append(".CURRVAL FROM DUAL ");
		return query.toString();
	}
}
