package com.ejie.m62fb.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import com.ejie.m62fb.model.base.AbstractM62FBModel;
import com.ejie.m62fb.model.direccion.Direccion;
import com.ejie.m62fb.util.UtilSeguridad;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.m62fb.utils.constants.BDConstantes;
import com.ejie.m62fb.utils.sql.Utilidades;

public class SQLGenericas {

	// Metodo INSERT AbstractM62FBModel
	public static final String INSERT_ABSTRACT_CLASS_SQL = ", COD_USU_ULT_MODIF";
	public static final String INSERT_ABSTRACT_CLASS_QUESTION_TAGS = ",?";
	// Metodo UPDATE AbstractM62FBModel
	public static final String UPDATE_ABSTRACT_CLASS_SQL = ", FEH_ULT_MODIF=SYSDATE, COD_USU_ULT_MODIF=? ";

	// Metodo INSERT Direccion
	public static final String INSERT_DIRECCION_CLASS_SQL = ", ID_PAIS, ID_PROVINCIA, ID_MUNICIPIO, ID_LOCALIDAD, ID_CALLE, CODIGO_POSTAL, BLOQUE, NUMERO, BIS, ESCALERA, PISO, MANO, PUERTA ";
	public static final String INSERT_DIRECCION_CLASS_QUESTION_TAGS = ",?,?,?,?,?,?,?,?,?,?,?,?,?";
	// Metodo UPDATE Direccion
	public static final String UPDATE_DIRECCION_CLASS_SQL = ", ID_PAIS=?, ID_PROVINCIA=?, ID_MUNICIPIO=?, ID_LOCALIDAD=?, ID_CALLE=?, CODIGO_POSTAL=?, BLOQUE=?, NUMERO=?, BIS=?, ESCALERA=?, PISO=?, MANO=?, PUERTA=? ";

	/**
	 * Metodo encargada de devolver los campos de una AbstractM62FBModel para
	 * usar en una Select
	 * 
	 * @param alias
	 *            String, alias.length() < 11
	 * @return String
	 */
	public static String getSqlCamposAbstractClass(String alias) {

		alias = !Utilidades.isEmpty(alias) ? alias : "";
		String aliasTabla = !Utilidades.isEmpty(alias) ? alias + "." : "";

		StringBuffer camposSql = new StringBuffer();
		camposSql.append(", ").append(aliasTabla).append("FEC_ALTA")
				.append(" ").append(alias).append("FECALTA");
		camposSql.append(", ").append(aliasTabla).append("FEH_ULT_MODIF")
				.append(" ").append(alias).append("FEHULTMODIF");
		camposSql.append(", ").append(aliasTabla).append("COD_USU_ULT_MODIF")
				.append(" ").append(alias).append("CODUSUULTMODIF ");

		return camposSql.toString();
	}

	/**
	 * Metodo que inserta en el array "params" los parametros de
	 * AbstractM62FBModel
	 * 
	 * @param params
	 *            List<Object>
	 * @param model
	 *            AbstractM62FBModel
	 */
	public static void getParamsAbstractClass(List<Object> params,
			AbstractM62FBModel model) {

		// Nombre Usuario Conectado
		String usuarioConectado = UtilSeguridad.getNombreUsuarioConectado();

		if (model != null) {
			model.setCodUsuarioUltimaModif(usuarioConectado);
		}

		// COD_USU_ULT_MODIF
		params.add(usuarioConectado);
	}

	/**
	 * Metodo encargada de devolver los campos de una Direccion para usar en una
	 * Select (Sin JOINs)
	 * 
	 * @param alias
	 *            String, alias.length() < 13
	 * @return String
	 */
	public static String getSqlCamposDireccion(String alias) {

		alias = !Utilidades.isEmpty(alias) ? alias : "";
		String aliasTabla = !Utilidades.isEmpty(alias) ? alias + "." : "";

		StringBuffer camposSql = new StringBuffer();
		camposSql.append(", ").append(aliasTabla).append("ID_PAIS").append(" ")
				.append(alias).append("IDPAIS");
		camposSql.append(", ").append(aliasTabla).append("ID_PROVINCIA")
				.append(" ").append(alias).append("IDPROVINCIA");
		camposSql.append(", ").append(aliasTabla).append("ID_MUNICIPIO")
				.append(" ").append(alias).append("IDMUNICIPIO");
		camposSql.append(", ").append(aliasTabla).append("ID_LOCALIDAD")
				.append(" ").append(alias).append("IDLOCALIDAD");
		camposSql.append(", ").append(aliasTabla).append("ID_CALLE")
				.append(" ").append(alias).append("IDCALLE");
		camposSql.append(", ").append(aliasTabla).append("BLOQUE").append(" ")
				.append(alias).append("BLOQUE");
		camposSql.append(", ").append(aliasTabla).append("NUMERO").append(" ")
				.append(alias).append("NUMERO");
		camposSql.append(", ").append(aliasTabla).append("BIS").append(" ")
				.append(alias).append("BIS");
		camposSql.append(", ").append(aliasTabla).append("CODIGO_POSTAL")
				.append(" ").append(alias).append("CODIGOPOSTAL");
		camposSql.append(", ").append(aliasTabla).append("ESCALERA")
				.append(" ").append(alias).append("ESCALERA");
		camposSql.append(", ").append(aliasTabla).append("PISO").append(" ")
				.append(alias).append("PISO");
		camposSql.append(", ").append(aliasTabla).append("MANO").append(" ")
				.append(alias).append("MANO");
		camposSql.append(", ").append(aliasTabla).append("PUERTA").append(" ")
				.append(alias).append("PUERTA ");

		return camposSql.toString();
	}

	/**
	 * Metodo encargada de devolver los campos de una Direccion para usar en una
	 * Select. (Con VISTA)
	 * 
	 * @param aliasTabla
	 *            String, alias de la tabla "principal"
	 * @param prefixDir
	 *            String, Prefijo del alias de direccion. prefixDir.length() <
	 *            10
	 * @return String
	 */
	public static String getSqlCamposDireccionCompleta(String aliasTabla,
			String prefixDir) {

		aliasTabla = !Utilidades.isEmpty(aliasTabla) ? aliasTabla + "." : "";
		prefixDir = !Utilidades.isEmpty(prefixDir) ? prefixDir + "_" : "";

		StringBuffer camposSql = new StringBuffer();
		// Direccion
		camposSql.append(", ").append(aliasTabla).append("ID_PAIS").append(" ")
				.append(prefixDir).append("IDPAIS");
		camposSql.append(", ").append(aliasTabla).append("BLOQUE").append(" ")
				.append(prefixDir).append("BLOQUE");
		camposSql.append(", ").append(aliasTabla).append("NUMERO").append(" ")
				.append(prefixDir).append("NUMERO");
		camposSql.append(", ").append(aliasTabla).append("BIS").append(" ")
				.append(prefixDir).append("BIS");
		camposSql.append(", ").append(aliasTabla).append("CODIGO_POSTAL")
				.append(" ").append(prefixDir).append("CP");
		camposSql.append(", ").append(aliasTabla).append("ESCALERA")
				.append(" ").append(prefixDir).append("ESCALERA");
		camposSql.append(", ").append(aliasTabla).append("PISO").append(" ")
				.append(prefixDir).append("PISO");
		camposSql.append(", ").append(aliasTabla).append("MANO").append(" ")
				.append(prefixDir).append("MANO");
		camposSql.append(", ").append(aliasTabla).append("PUERTA").append(" ")
				.append(prefixDir).append("PUERTA");
		// Provincia
		camposSql.append(", ").append(aliasTabla).append("ID_PROVINCIA")
				.append(" ").append(prefixDir).append("IDPROVINCIA");
		camposSql.append(", ").append(aliasTabla).append("DESC_PROVINCIA")
				.append(" ").append(prefixDir).append("DESCPROVINCIA");
		// Municipio
		camposSql.append(", ").append(aliasTabla).append("ID_MUNICIPIO")
				.append(" ").append(prefixDir).append("IDMUNICIPIO");
		camposSql.append(", ").append(aliasTabla).append("DESC_MUNICIPIO")
				.append(" ").append(prefixDir).append("DESCMUNICIPIO");
		// Localidad
		camposSql.append(", ").append(aliasTabla).append("ID_LOCALIDAD")
				.append(" ").append(prefixDir).append("IDLOCALIDAD");
		camposSql.append(", ").append(aliasTabla).append("DESC_LOCALIDAD")
				.append(" ").append(prefixDir).append("DESCLOCALIDAD");
		// Calle
		camposSql.append(", ").append(aliasTabla).append("ID_CALLE")
				.append(" ").append(prefixDir).append("IDCALLE");
		camposSql.append(", ").append(aliasTabla).append("DESC_CALLE_ES")
				.append(" ").append(prefixDir).append("DESCCALLEES");
		camposSql.append(", ").append(aliasTabla).append("DESC_CALLE_EU")
				.append(" ").append(prefixDir).append("DESCCALLEEU");

		return camposSql.toString();
	}

	/**
	 * Metodo que inserta en el array "params" los parametros de Direccion
	 * 
	 * @param params
	 *            List<Object>
	 * @param model
	 *            Direccion
	 */
	public static void getParamsDireccion(List<Object> params,
			Direccion direccion) {

		if (direccion != null) {
			// Pais
			if (direccion.getPais() != null) {
				params.add(direccion.getPais().getId());
			} else {
				params.add(AppConstantes.PAIS_ESPANYA);
			}
			// Provincia
			if (direccion.getProvincia() != null) {
				params.add(direccion.getProvincia().getId());
			} else {
				params.add(null);
			}
			// Municipio
			if (direccion.getMunicipio() != null) {
				params.add(direccion.getMunicipio().getId());
			} else {
				params.add(null);
			}
			// Localidad
			if (direccion.getLocalidad() != null) {
				params.add(direccion.getLocalidad().getId());
			} else {
				params.add(null);
			}
			// Calle
			if (direccion.getCalle() != null) {
				params.add(direccion.getCalle().getId());
			} else {
				params.add(null);
			}
			// Portal
			if (direccion.getPortal() != null) {
				// Codigo Postal
				if (!Utilidades
						.isEmpty(direccion.getPortal().getCodigoPostal())) {
					params.add(direccion.getPortal().getCodigoPostal().trim());
				} else {
					params.add(null);
				}
				// Bloque
				if (!Utilidades.isEmpty(direccion.getPortal().getBloque())) {
					params.add(direccion.getPortal().getBloque().trim());
				} else {
					params.add(null);
				}
				// Numero
				if (!Utilidades.isEmpty(direccion.getPortal().getNumero())) {
					params.add(direccion.getPortal().getNumero().trim());
				} else {
					params.add(null);
				}
				// Bis
				if (!Utilidades.isEmpty(direccion.getPortal().getBis())) {
					params.add(direccion.getPortal().getBis().trim());
				} else {
					params.add(null);
				}
			} else {
				// Codigo Postal
				params.add(null);
				// Bloque
				params.add(null);
				// Numero
				params.add(null);
				// Bis
				params.add(null);
			}
			// Planta
			if (direccion.getPlanta() != null) {
				// Escalera
				if (!Utilidades.isEmpty(direccion.getPlanta().getEscalera())) {
					params.add(direccion.getPlanta().getEscalera().trim());
				} else {
					params.add(null);
				}
				// Piso
				if (!Utilidades.isEmpty(direccion.getPlanta().getPiso())) {
					params.add(direccion.getPlanta().getPiso().trim());
				} else {
					params.add(null);
				}
			} else {
				// Escalera
				params.add(null);
				// Piso
				params.add(null);
			}
			// Mano
			if (!Utilidades.isEmpty(direccion.getMano())) {
				params.add(direccion.getMano().trim());
			} else {
				params.add(null);
			}
			// Puerta
			if (!Utilidades.isEmpty(direccion.getPuerta())) {
				params.add(direccion.getPuerta().trim());
			} else {
				params.add(null);
			}
		} else {
			// Pais
			params.add(null);
			// Provincia
			params.add(null);
			// Municipio
			params.add(null);
			// Localidad
			params.add(null);
			// Calle
			params.add(null);
			// Codigo Postal
			params.add(null);
			// Bloque
			params.add(null);
			// Numero
			params.add(null);
			// Bis
			params.add(null);
			// Escalera
			params.add(null);
			// Piso
			params.add(null);
			// Mano
			params.add(null);
			// Puerta
			params.add(null);
		}
	}
	/**
	 * Metodo que inserta en el array "params" los parametros de Direccion
	 * 
	 * @param params
	 *            List<Object>
	 * @param model
	 *            Direccion
	 * @throws SQLException 
	 */
	public static int getParamsDireccionKEyHolder(PreparedStatement ps,
			Direccion direccion,int pos) throws SQLException {

		if (direccion != null) {
			// Pais
			if (direccion.getPais() != null) {
				ps.setObject(pos++,direccion.getPais().getId());
			} else {
				ps.setObject(pos++,AppConstantes.PAIS_ESPANYA);
			}
			// Provincia
			if (direccion.getProvincia() != null) {
				ps.setObject(pos++,direccion.getProvincia().getId());
			} else {
				ps.setObject(pos++,null);
			}
			// Municipio
			if (direccion.getMunicipio() != null) {
				ps.setObject(pos++,direccion.getMunicipio().getId());
			} else {
				ps.setObject(pos++,null);
			}
			// Localidad
			if (direccion.getLocalidad() != null) {
				ps.setObject(pos++,direccion.getLocalidad().getId());
			} else {
				ps.setObject(pos++,null);
			}
			// Calle
			if (direccion.getCalle() != null) {
				ps.setObject(pos++,direccion.getCalle().getId());
			} else {
				ps.setObject(pos++,null);
			}
			// Portal
			if (direccion.getPortal() != null) {
				// Codigo Postal
				if (!Utilidades
						.isEmpty(direccion.getPortal().getCodigoPostal())) {
					ps.setObject(pos++,direccion.getPortal().getCodigoPostal().trim());
				} else {
					ps.setObject(pos++,null);
				}
				// Bloque
				if (!Utilidades.isEmpty(direccion.getPortal().getBloque())) {
					ps.setObject(pos++,direccion.getPortal().getBloque().trim());
				} else {
					ps.setObject(pos++,null);
				}
				// Numero
				if (!Utilidades.isEmpty(direccion.getPortal().getNumero())) {
					ps.setObject(pos++,direccion.getPortal().getNumero().trim());
				} else {
					ps.setObject(pos++,null);
				}
				// Bis
				if (!Utilidades.isEmpty(direccion.getPortal().getBis())) {
					ps.setObject(pos++,direccion.getPortal().getBis().trim());
				} else {
					ps.setObject(pos++,null);
				}
			} else {
				// Codigo Postal
				ps.setObject(pos++,null);
				// Bloque
				ps.setObject(pos++,null);
				// Numero
				ps.setObject(pos++,null);
				// Bis
				ps.setObject(pos++,null);
			}
			// Planta
			if (direccion.getPlanta() != null) {
				// Escalera
				if (!Utilidades.isEmpty(direccion.getPlanta().getEscalera())) {
					ps.setObject(pos++,direccion.getPlanta().getEscalera().trim());
				} else {
					ps.setObject(pos++,null);
				}
				// Piso
				if (!Utilidades.isEmpty(direccion.getPlanta().getPiso())) {
					ps.setObject(pos++,direccion.getPlanta().getPiso().trim());
				} else {
					ps.setObject(pos++,null);
				}
			} else {
				// Escalera
				ps.setObject(pos++,null);
				// Piso
				ps.setObject(pos++,null);
			}
			// Mano
			if (!Utilidades.isEmpty(direccion.getMano())) {
				ps.setObject(pos++,direccion.getMano().trim());
			} else {
				ps.setObject(pos++,null);
			}
			// Puerta
			if (!Utilidades.isEmpty(direccion.getPuerta())) {
				ps.setObject(pos++,direccion.getPuerta().trim());
			} else {
				ps.setObject(pos++,null);
			}
		} else {
			// Pais
			ps.setObject(pos++,null);
			// Provincia
			ps.setObject(pos++,null);
			// Municipio
			ps.setObject(pos++,null);
			// Localidad
			ps.setObject(pos++,null);
			// Calle
			ps.setObject(pos++,null);
			// Codigo Postal
			ps.setObject(pos++,null);
			// Bloque
			ps.setObject(pos++,null);
			// Numero
			ps.setObject(pos++,null);
			// Bis
			ps.setObject(pos++,null);
			// Escalera
			ps.setObject(pos++,null);
			// Piso
			ps.setObject(pos++,null);
			// Mano
			ps.setObject(pos++,null);
			// Puerta
			ps.setObject(pos++,null);
		}
		return pos++;
	}
	/**
	 * Metodo encargado de devolver los campos de un Valor_Combos (P28) para
	 * usar en una Select
	 * 
	 * @param aliasP28
	 *            String, alias.length() < 14
	 * @return String
	 */
	public static String getSqlCamposP28(String aliasP28) {

		String aliasTabla = aliasP28 + ".";

		StringBuffer camposSql = new StringBuffer();
		camposSql.append(", ").append(aliasTabla).append("NUM_REGISTRO")
				.append(" ").append(aliasP28).append("NUMREGISTRO");
		camposSql.append(", ").append(aliasTabla).append("COD_TABLA")
				.append(" ").append(aliasP28).append("CODTABLA");
		camposSql.append(", ").append(aliasTabla).append("DES_TABLA_CAS")
				.append(" ").append(aliasP28).append("DESTABLACAS");
		camposSql.append(", ").append(aliasTabla).append("DES_TABLA_EUS")
				.append(" ").append(aliasP28).append("DESTABLAEUS");

		return camposSql.toString();
	}

	/**
	 * Devuelve un string con la sql para incluir la join necesarias para
	 * conseguir una descripcion de P28 (JOINs)
	 * 
	 * @param aliasP28
	 *            String, alias que s ele quiere dar a la tabla P28
	 * @return String
	 */
	public static String getSqlJoinP28(String aliasP28) {

		StringBuffer joinsSql = new StringBuffer();
		joinsSql.append(", ").append(BDConstantes.VALOR_COMBOS).append(" ")
				.append(aliasP28);

		return joinsSql.toString();
	}

	/**
	 * Devuelve la SQL para utilizar en la where para las joins con P28
	 * 
	 * @param aliasTabla
	 *            String, alias de la tabla con la que se hace join
	 * @param column
	 *            String, nombre de la columna con la que se hace join
	 * @param aliasP28
	 *            String, alias para la tabla P28
	 * @param p28Tipo
	 *            int, valor del tipo de combo
	 * @return String
	 */
	public static String getSqlWhereJoinP28(String aliasTabla, String column,
			String aliasP28, int p28Tipo) {

		StringBuffer whereSql = new StringBuffer();
		whereSql.append(" AND (").append(aliasTabla).append(".").append(column)
				.append(" = ").append(aliasP28).append(".COD_TABLA(+)");
		whereSql.append(" AND ").append(aliasP28).append(".NUM_REGISTRO = ")
				.append(p28Tipo).append(")");

		return whereSql.toString();
	}

	/**
	 * Devuelve un string con la sql para incluir la join necesarias para
	 * conseguir una descripcion de una tabla dada (JOINs)
	 * 
	 * @param alias
	 *            String, alias que se le quiere dar a la tabla
	 * @return String
	 */
	public static String getSqlJoin(String tabla, String alias) {

		StringBuffer joinsSql = new StringBuffer();
		joinsSql.append(", ").append(tabla).append(" ").append(alias);

		return joinsSql.toString();
	}

	/**
	 * Metodo encargado de devolver los campos de una join para usar en una
	 * Select
	 * 
	 * @param alias
	 *            String, alias.length() < 14
	 * @return String
	 */
	public static String getSqlCampos(String aliasCodTabla, String alias,
			String columnCodigo, String columnDescEs, String columnDescEu) {

		String aliasTabla = alias + ".";

		StringBuffer camposSql = new StringBuffer();
		camposSql.append(", ").append(aliasCodTabla + ".").append(columnCodigo)
				.append(" ").append(alias)
				.append(columnCodigo.replaceAll("_", ""));
		camposSql.append(", ").append(aliasTabla).append(columnDescEs)
				.append(" ").append(alias)
				.append(columnDescEs.replaceAll("_", ""));
		camposSql.append(", ").append(aliasTabla).append(columnDescEu)
				.append(" ").append(alias)
				.append(columnDescEu.replaceAll("_", ""));

		return camposSql.toString();
	}

	/**
	 * Metodo encargado de devolver los campos de una join para usar en una
	 * Select
	 * 
	 * @param alias
	 *            String, alias.length() < 14
	 * @return String
	 */
	public static String getSqlCampos(String alias, String columnCodigo,
			String columnDescEs, String columnDescEu) {

		String aliasTabla = alias + ".";

		StringBuffer camposSql = new StringBuffer();
		camposSql.append(", ").append(aliasTabla).append(columnCodigo)
				.append(" ").append(alias)
				.append(columnCodigo.replaceAll("_", ""));
		camposSql.append(", ").append(aliasTabla).append(columnDescEs)
				.append(" ").append(alias)
				.append(columnDescEs.replaceAll("_", ""));
		camposSql.append(", ").append(aliasTabla).append(columnDescEu)
				.append(" ").append(alias)
				.append(columnDescEu.replaceAll("_", ""));

		return camposSql.toString();
	}

	/**
	 * Devuelve la SQL para utilizar en la where para las joins con una tabla
	 * dada
	 * 
	 * @param aliasTabla
	 *            String, alias de la tabla con la que se hace join
	 * @param column
	 *            String, nombre de la columna con la que se hace join
	 * @param alias
	 *            String, alias para la tabla dada
	 * @param tipo
	 *            int, valor del tipo de combo
	 * @return String
	 */
	public static String getSqlWhereJoin(String aliasTabla1,
			String columnTabla1, String aliasTabla2, String columnTabla2) {

		StringBuffer whereSql = new StringBuffer();
		whereSql.append(" AND ").append(aliasTabla1).append(".")
				.append(columnTabla1).append(" = ").append(aliasTabla2)
				.append(".").append(columnTabla2 + "(+)");

		return whereSql.toString();
	}

	/**
	 * Metodo para generar el total de values a añadir a una SQL
	 * 
	 * @param size
	 * @return
	 */
	public static String getValuesSQLFor(int size) {

		String base = ") VALUES ( ";
		StringBuffer valueAux = new StringBuffer();
		if (size > 0) {
			valueAux.append(" ? ");
			size--;
			while (size > 0) {
				valueAux.append(" ,? ");
				size--;
			}
		}
		return base + valueAux.toString();
	}
}