package com.ejie.ab39a.constantes;

import org.springframework.jdbc.core.JdbcTemplate;

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

	TECNICOSENTIDAD("TECNICOS_ENTIDAD_SEQ"), ENTIDADES("ENTIDADES_SEQ"), PLANIFICACION("PLANIFICACION_SEQ"), ELEMENTOS(
			"ELEMENTOS_PE_SEQ"), PLANES_ESTRATEGICOS("PLANES_ESTRATEGICOS_SEQ"), ACCIONESPG(
					"ACCIONES_PG_SEQ"), ELEMENTOSPG("ELEMENTOS_PG_SEQ"), IDELEMENTONUEVO(
							"ELEMENTOSGEN_SEQ"), PLANES_GESTION("PLANES_GESTION_SEQ");

	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 jdbcTemplate
	 * @return Long valorActualSec
	 */
	public Long getNextLong(JdbcTemplate jdbcTemplate) {
		return jdbcTemplate.queryForObject(SecuenciasSQL.getSelectNext(this.codSecuencia), Long.class);
	}

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

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

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

	/**
	 * Devuelve la operacion que se puede incluir dentro de una sentencia
	 * 'insert' o 'update'.
	 * 
	 * @return String
	 */
	public String getEmbedNextVal() {
		StringBuilder query = new StringBuilder();
		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
	 */
	private static String getSelectNext(String secuencia) {
		StringBuilder query = new StringBuilder();
		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
	 */
	private static String getSelectCurrent(String secuencia) {
		StringBuilder query = new StringBuilder();
		query.append("SELECT ");
		query.append(secuencia);
		query.append(".CURRVAL FROM DUAL ");
		return query.toString();
	}
}