package com.ejie.ab39a.dao;

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.dao.support.DataAccessUtils;
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.ab39a.constantes.Constantes;
import com.ejie.ab39a.constantes.SecuenciasSQL;
import com.ejie.ab39a.model.Entidades;
import com.ejie.ab39a.model.TecnicosEntidad;
import com.ejie.ab39a.model.TiposIdentif;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.TableRowDto;
import com.gfi.constants.Constants;
import com.gfi.utils.UtilSQL;

/**
 * EntidadesDaoImpl.
 * 
 *  
 */

@Repository
@Transactional
public class EntidadesDaoImpl implements EntidadesDao {

    private static final String[] ORDER_BY_WHITE_LIST = new String[] { "CODENTIDAD", "CODTECNICO", "DESENTIDAD",
            "CIFNIF", "CODTH", "CODMUN", "DIRECCION", "EMAIL", "TFNO" };

    private JdbcTemplate jdbcTemplate;

    /*
     * ROW_MAPPERS
     */
    private RowMapper<Entidades> rwMap = new RowMapper<Entidades>() {
        @Override
        public Entidades mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            return new Entidades(resultSet.getInt("CODENTIDAD"), resultSet.getString("DESENTIDAD"),
                    resultSet.getString("CIFNIF"), resultSet.getString("CODTH"), resultSet.getString("CODMUN"),
                    resultSet.getString("DIRECCION"), resultSet.getString("EMAIL"), resultSet.getInt("NUM_CALLE"),
                    resultSet.getInt("NUM_TRABAJADORES"), resultSet.getInt("NUM_TRAB_HOMBRE"),
                    resultSet.getInt("NUM_TRAB_MUJER"), resultSet.getString("TFNO"), resultSet.getString("CP"),
                    resultSet.getInt("TIPO_ENTIDAD"), resultSet.getInt("BAJA"), new TecnicosEntidad(null),
                    resultSet.getInt("SOLICINFOR"), resultSet.getString("LOCALIDAD"),
                    resultSet.getString("MUNICIPIOTXT"), resultSet.getString("LOCALIDADTXT"));
        }
    };
    private RowMapper<Entidades> rwMapIdentif = new RowMapper<Entidades>() {
        @Override
        public Entidades mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            return new Entidades(resultSet.getInt("CODENTIDAD"), resultSet.getString("DESENTIDAD"),
                    resultSet.getString("CIFNIF"), resultSet.getString("CODTH"), resultSet.getString("CODMUN"),
                    resultSet.getString("DIRECCION"), resultSet.getString("EMAIL"), resultSet.getInt("NUM_CALLE"),
                    resultSet.getInt("NUM_TRABAJADORES"), resultSet.getInt("NUM_TRAB_HOMBRE"),
                    resultSet.getInt("NUM_TRAB_MUJER"), resultSet.getString("TFNO"), resultSet.getString("CP"),
                    resultSet.getInt("TIPO_ENTIDAD"), resultSet.getInt("BAJA"),
                    new TiposIdentif(resultSet.getLong("TIPOIDENTIF")), resultSet.getInt("SOLICINFOR"),
                    resultSet.getString("LOCALIDAD"), resultSet.getString("MUNICIPIOTXT"),
                    resultSet.getString("LOCALIDADTXT"));
        }
    };

    private RowMapper<Entidades> rwMapLike = new RowMapper<Entidades>() {
        @Override
        public Entidades mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            Entidades entidad = new Entidades(resultSet.getInt("CODENTIDAD"), resultSet.getString("DESENTIDAD"),
                    resultSet.getString("CIFNIF"), resultSet.getString("CODTH"), resultSet.getString("CODMUN"),
                    resultSet.getString("DIRECCION"), resultSet.getString("EMAIL"), resultSet.getInt("NUM_CALLE"),
                    resultSet.getInt("NUM_TRABAJADORES"), resultSet.getInt("NUM_TRAB_HOMBRE"),
                    resultSet.getInt("NUM_TRAB_MUJER"), resultSet.getString("TFNO"), resultSet.getString("CP"),
                    resultSet.getInt("TIPO_ENTIDAD"), resultSet.getInt("BAJA"), resultSet.getString("DESCPROVINCIA"),
                    resultSet.getString("DESCMUNICIPIO"), new TecnicosEntidad(null), resultSet.getInt("SOLICINFOR"),
                    resultSet.getString("MUNICIPIOTXT"), resultSet.getString("LOCALIDADTXT"));
            TiposIdentif tipo = new TiposIdentif();
            tipo.setCodigo(resultSet.getLong("TIPOIDENTIF"));
            entidad.setTipoIdentif(tipo);
            entidad.setCodloc(resultSet.getString("CODLOC"));
            entidad.setLocalidad(resultSet.getString("DESCLOC"));
            entidad.setNumplanesEs(resultSet.getInt("numplanese"));
            return entidad;
        }
    };

    private RowMapper<Entidades> rwMapPK = new RowMapper<Entidades>() {
        @Override
        public Entidades mapRow(ResultSet resultSet, int rowNum) throws SQLException {
            return new Entidades(resultSet.getInt("CODENTIDAD"));
        }
    };

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

    /*
     * OPERACIONES CRUD
     */

    /**
     * Inserts a single row in the Entidades table.
     *
     * @param entidades
     *            Entidades
     * @return Entidades
     */
    @Override
    public Entidades add(Entidades entidades) {
        StringBuilder query = new StringBuilder(
                "INSERT INTO ENTIDADES (CODENTIDAD, DESENTIDAD, TIPOIDENTIF, CIFNIF, CODTH, CODMUN, DIRECCION, EMAIL, NUM_CALLE, NUM_TRABAJADORES, NUM_TRAB_HOMBRE, NUM_TRAB_MUJER, TFNO, CP, TIPO_ENTIDAD,SOLICINFOR,LOCALIDAD,MUNICIPIOTXT,LOCALIDADTXT) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
        // Object getTecnicosEntidadCodtecnicoAux = null;
        // if (entidades.getTecnicosEntidad() != null &&
        // entidades.getTecnicosEntidad().getCodtecnico() != null) {
        // getTecnicosEntidadCodtecnicoAux =
        // entidades.getTecnicosEntidad().getCodtecnico();
        // }

        Integer idEntidad = SecuenciasSQL.ENTIDADES.getNextInteger(jdbcTemplate);
        entidades.setCodentidad(idEntidad);

        this.jdbcTemplate.update(query.toString(), entidades.getCodentidad(), entidades.getDesentidad(),
                entidades.getTipoIdentif().getCodigo(), entidades.getCifnif(), entidades.getCodth(),
                entidades.getCodmun(), entidades.getDireccion(), entidades.getEmail(), entidades.getNumCalle(),
                entidades.getNumTrabajadores(), entidades.getNumTrabHombre(), entidades.getNumTrabMujer(),
                entidades.getTfno(), entidades.getCp(), entidades.getTipoEntidad(), entidades.getSolicInfor(),
                entidades.getCodloc(), entidades.getMuniExt(), entidades.getLocaExt());
        // }
        return entidades;
    }

    /**
     * Updates a single row in the Entidades table.
     *
     * @param entidades
     *            Entidades
     * @return Entidades
     */
    @Override
    public Entidades update(Entidades entidades) {
        StringBuilder query = new StringBuilder(
                "UPDATE ENTIDADES SET DESENTIDAD=?, TIPOIDENTIF=?, CIFNIF=?, CODTH=?, CODMUN=?, DIRECCION=?, EMAIL=?, NUM_CALLE=?, NUM_TRABAJADORES=?, NUM_TRAB_HOMBRE=?, NUM_TRAB_MUJER=?, TFNO=?, CP=?, TIPO_ENTIDAD=?, SOLICINFOR =?, LOCALIDAD = ? ,MUNICIPIOTXT=? ,LOCALIDADTXT=? ");
        query.append(" WHERE CODENTIDAD=?");
        // Object getTecnicosEntidadCodtecnicoAux = null;
        // if (entidades.getTecnicosEntidad() != null &&
        // entidades.getTecnicosEntidad().getCodtecnico() != null) {
        // getTecnicosEntidadCodtecnicoAux =
        // entidades.getTecnicosEntidad().getCodtecnico();
        // }
        this.jdbcTemplate.update(query.toString(), entidades.getDesentidad(), entidades.getTipoIdentif().getCodigo(),
                entidades.getCifnif(), entidades.getCodth(), entidades.getCodmun(), entidades.getDireccion(),
                entidades.getEmail(), entidades.getNumCalle(), entidades.getNumTrabajadores(),
                entidades.getNumTrabHombre(), entidades.getNumTrabMujer(), entidades.getTfno(), entidades.getCp(),
                entidades.getTipoEntidad(), entidades.getSolicInfor(), entidades.getCodloc(), entidades.getMuniExt(),
                entidades.getLocaExt(), entidades.getCodentidad());
        return entidades;
    }

    /**
     * Updates a single row in the Entidades table.
     *
     * @param entidades
     *            Entidades
     * @return Entidades
     */
    @Override
    public Entidades updateEntidad(Entidades entidades) {
        StringBuilder query = new StringBuilder(
                "UPDATE ENTIDADES SET EMAIL=?, NUM_TRABAJADORES=?, NUM_TRAB_HOMBRE=?, NUM_TRAB_MUJER=?, TFNO=?");
        query.append(" WHERE CODENTIDAD=?");

        this.jdbcTemplate.update(query.toString(), entidades.getEmail(), entidades.getNumTrabajadores(),
                entidades.getNumTrabHombre(), entidades.getNumTrabMujer(), entidades.getTfno(),
                entidades.getCodentidad());
        return entidades;
    }

    /**
     * Finds a single row in the Entidades table.
     *
     * @param entidades
     *            Entidades
     * @return Entidades
     */
    @Override
    @Transactional(readOnly = true)
    public Entidades find(Entidades entidades) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));
        // WHERE
        query.append(" WHERE t1.CODENTIDAD = ? ");

        List<Entidades> entidadesList = this.jdbcTemplate.query(query.toString(), this.rwMapIdentif,
                entidades.getCodentidad());
        return DataAccessUtils.uniqueResult(entidadesList);
    }

    /**
     * Removes a single row in the Entidades table.
     *
     * @param entidades
     *            Entidades
     */
    @Override
    public void remove(Entidades entidades) {
        String query = "UPDATE ENTIDADES SET BAJA=? WHERE CODENTIDAD=?";
        int estado = Constantes.BAJA_LOGICA;
        if (entidades.getBaja() == Constantes.BAJA_LOGICA) {
            estado = Constantes.ALTA_LOGICA;
        } else if (entidades.getBaja() == Constantes.ALTA_LOGICA) {
            estado = Constantes.BAJA_LOGICA;
        }
        this.jdbcTemplate.update(query, estado, entidades.getCodentidad());
    }

    /**
     * Finds a list of rows in the Entidades table.
     * 
     * @param entidades
     *            Entidades
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @return List<Entidades>
     */
    @Override
    @Transactional(readOnly = true)
    public List<Entidades> findAll(Entidades entidades, JQGridRequestDto jqGridRequestDto) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));
        query.append(", ENTIDAD_TECNICO t2 ");

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereMap(entidades);
        StringBuilder where = new StringBuilder(" WHERE 1=1 ");
        where.append(" AND t1.CODENTIDAD = t2.CODENTIDAD(+) ");

        where.append(mapaWhere.get("query"));
        query.append(where);

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

        if (jqGridRequestDto != null) {
            query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, EntidadesDaoImpl.ORDER_BY_WHITE_LIST);
        }

        return this.jdbcTemplate.query(query.toString(), this.rwMap, params.toArray());
    }

    /**
     * Finds rows in the Entidades table using like.
     * 
     * @param entidades
     *            Entidades
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<Entidades>
     */
    @Override
    @Transactional(readOnly = true)
    public List<Entidades> findAllLike(Entidades entidades, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(
                "SELECT DISTINCT t1.CODENTIDAD CODENTIDAD, t1.DESENTIDAD DESENTIDAD, t1.CIFNIF CIFNIF, t1.CODTH CODTH, t1.EMAIL EMAIL, t1.NUM_CALLE NUM_CALLE, "
                        + "t1.NUM_TRABAJADORES NUM_TRABAJADORES, t1.NUM_TRAB_HOMBRE NUM_TRAB_HOMBRE, t1.NUM_TRAB_MUJER NUM_TRAB_MUJER, t1.TFNO TFNO, t1.CP CP, "
                        + "t1.TIPO_ENTIDAD TIPO_ENTIDAD, t1.CODMUN CODMUN, t1.DIRECCION DIRECCION, t3.DESC_OF DESCPROVINCIA, t4.DESC_OF DESCMUNICIPIO, t1.BAJA BAJA,t1.TIPOIDENTIF,t1.SOLICINFOR "
                        + " ,t6.DESC_OF AS DESCLOC , t1.LOCALIDAD AS CODLOC,t1.MUNICIPIOTXT,t1.LOCALIDADTXT ");

        query.append(
                " ,(select count(1) tieneplan from planes_estrategicos t8 where t8.CODENTIDAD = t1.codentidad and t8.baja=0  )  numplanese");

        query.append(" FROM ENTIDADES t1 , PROVINCIA t3, MUNICIPIO t4, LOCALIDAD t6 ");

        if (entidades != null && entidades.getTecnicosEntidad() != null
                && entidades.getTecnicosEntidad().getCodtecnico() != null) {
            query.append(",ENTIDAD_TECNICO t5 ");
        }

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMap(entidades, startsWith);
        StringBuilder where = new StringBuilder(
                " WHERE 1=1 AND t3.ID_PROVINCIA(+) = t1.CODTH AND t4.ID_MUNICIPIO(+) = t1.CODMUN AND t4.ID_PROVINCIA(+) = t1.CODTH ");
        where.append(
                " AND t6.ID_PROVINCIA(+) = t1.CODTH AND t6.ID_MUNICIPIO(+) = t1.CODMUN AND t6.ID_LOCALIDAD(+) = t1.LOCALIDAD ");
        where.append(mapaWhere.get("query"));
        query.append(where);

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

        if (jqGridRequestDto != null) {
            query = JQGridManager.getPaginationQuery(jqGridRequestDto, query, EntidadesDaoImpl.ORDER_BY_WHITE_LIST);
        }

        return this.jdbcTemplate.query(query.toString(), this.rwMapLike, params.toArray());
    }

    /*
     * OPERACIONES RUP_TABLE
     */

    /**
     * Counts rows in the Entidades table.
     * 
     * @param entidades
     *            Entidades
     * @return Long
     */
    @Override
    @Transactional(readOnly = true)
    public Long findAllCount(Entidades entidades) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        // query.append("SELECT COUNT(1) FROM ENTIDADES t1 , TECNICOS_ENTIDAD
        // t2, ENTIDAD_TECNICO t5 ");
        query.append("SELECT COUNT(1) FROM ENTIDADES t1 , ENTIDAD_TECNICO t5 ");

        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereMap(entidades);
        StringBuilder where = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        // where.append(" WHERE 1=1 AND t5.CODTECNICO = t2.CODTECNICO(+) AND
        // t5.CODENTIDAD(+) = t1.CODENTIDAD ");
        where.append(" WHERE 1=1 AND t5.CODENTIDAD(+) = t1.CODENTIDAD ");

        where.append(mapaWhere.get("query"));
        query.append(where);

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

        return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
    }

    /**
     * Counts rows in the Entidades table using like.
     * 
     * @param entidades
     *            Entidades
     * @param startsWith
     *            Boolean
     * @return Long
     */
    @Override
    @Transactional(readOnly = true)
    public Long findAllLikeCount(Entidades entidades, Boolean startsWith) {
        StringBuilder query = new StringBuilder(
                "SELECT COUNT(1) FROM ENTIDADES t1,PROVINCIA t3,MUNICIPIO t4 ,LOCALIDAD t6  ");
        if (entidades != null && entidades.getTecnicosEntidad() != null
                && entidades.getTecnicosEntidad().getCodtecnico() != null) {
            query.append(",ENTIDAD_TECNICO t5");
        }
        // Where clause & Params
        Map<String, ?> mapaWhere = this.getWhereLikeMap(entidades, startsWith);
        StringBuilder where = new StringBuilder(
                " WHERE 1=1 AND t3.ID_PROVINCIA = t1.CODTH AND t4.ID_MUNICIPIO = t1.CODMUN AND t4.ID_PROVINCIA = t1.CODTH ");
        where.append(
                " AND t6.ID_PROVINCIA(+) = t1.CODTH AND t6.ID_MUNICIPIO(+) = t1.CODMUN AND t6.ID_LOCALIDAD(+) = t1.LOCALIDAD  ");

        where.append(mapaWhere.get("query"));
        query.append(where);

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

        return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);
    }

    /**
     * Reorder the data list of Entidades selected for rup_table
     * 
     * @param entidades
     *            Entidades
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     * @return List<TableRowDto<Entidades>>
     */
    @Override
    public List<TableRowDto<Entidades>> reorderSelection(Entidades entidades, JQGridRequestDto jqGridRequestDto,
            Boolean startsWith) {
        // SELECT - FROM
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

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

        // Parámetros de filtrado
        @SuppressWarnings(value = "unchecked")
        List<Object> filterParamList = (List<Object>) mapaWhere.get("params");

        // SQL para la reordenación
        StringBuilder sbReorderSelectionSQL = JQGridManager.getReorderQuery(query, jqGridRequestDto, Entidades.class,
                filterParamList, "CODENTIDAD");

        return this.jdbcTemplate.query(sbReorderSelectionSQL.toString(),
                new RowNumResultSetExtractor<Entidades>(this.rwMapPK, jqGridRequestDto), filterParamList.toArray());
    }

    /**
     * Remove multiple method for rup_table
     * 
     * @param filterEntidades
     *            Entidades
     * @param jqGridRequestDto
     *            JQGridRequestDto
     * @param startsWith
     *            Boolean
     */
    @Override
    public void removeMultiple(Entidades filterEntidades, JQGridRequestDto jqGridRequestDto, Boolean startsWith) {
        // SELECT - FROM
        /** TODO: select por clave */
        StringBuilder query = new StringBuilder(this.getSelectFromQuery(true));

        // WHERE
        Map<String, Object> mapaWhere = this.getWhereLikeMap(filterEntidades, startsWith);
        StringBuilder where = new StringBuilder(" WHERE 1=1 ");
        where.append(mapaWhere.get("query"));
        query.append(where);

        @SuppressWarnings(value = "unchecked")
        List<Object> params = (List<Object>) mapaWhere.get("params");

        StringBuilder sbRemoveMultipleSQL = JQGridManager.getRemoveMultipleQuery(jqGridRequestDto, Entidades.class,
                query, params, "CODENTIDAD");
        this.jdbcTemplate.update(sbRemoveMultipleSQL.toString(), params.toArray());
    }

    /*
     * MÉTODOS PRIVADOS
     */

    /**
     * Devuelve la Select con todos los campos. Incluye el From si se indica.
     * 
     * @param includeFrom
     *            boolean
     * @return String
     */
    private String getSelectFromQuery(boolean includeFrom) {
        StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
        query.append(
                "SELECT DISTINCT t1.CODENTIDAD CODENTIDAD, t1.DESENTIDAD DESENTIDAD, t1.CIFNIF CIFNIF, t1.CODTH CODTH, t1.EMAIL EMAIL, t1.NUM_CALLE NUM_CALLE, ");
        query.append(
                "t1.NUM_TRABAJADORES NUM_TRABAJADORES, t1.NUM_TRAB_HOMBRE NUM_TRAB_HOMBRE, t1.NUM_TRAB_MUJER NUM_TRAB_MUJER, t1.TFNO TFNO, t1.CP CP,  t1.MUNICIPIOTXT,t1.LOCALIDADTXT, ");
        query.append(
                " t1.TIPO_ENTIDAD TIPO_ENTIDAD, t1.CODMUN CODMUN, t1.DIRECCION DIRECCION, t1.BAJA BAJA, t1.TIPOIDENTIF TIPOIDENTIF,t1.SOLICINFOR SOLICINFOR,t1.LOCALIDAD ");
        if (includeFrom) {
            query.append(" FROM ENTIDADES t1 ");
        }
        return query.toString();
    }

    /**
     * Returns a map with the needed value to create the conditions to filter by the Entidades
     * entity
     * 
     * @param entidades
     *            Entidades 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(Entidades entidades) {

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

        if (entidades != null) {
            if (entidades.getCodentidad() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODENTIDAD", entidades.getCodentidad());
            }

            if (entidades.getTecnicosEntidad() != null && entidades.getTecnicosEntidad().getCodtecnico() != null) {
                UtilSQL.createFilterSQL(where, params, "t2.CODTECNICO", entidades.getTecnicosEntidad().getCodtecnico());
            }

            if (entidades.getDesentidad() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.DESENTIDAD", entidades.getDesentidad());
            }
            if (entidades.getCifnif() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CIFNIF", entidades.getCifnif().toUpperCase(), true);
            }
            if (entidades.getCodth() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODTH", entidades.getCodth());
            }
            if (entidades.getCodmun() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CODMUN", entidades.getCodmun());
            }
            if (entidades.getCodloc() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.LOCALIDAD", entidades.getCodloc());
            }
            if (entidades.getDireccion() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.DIRECCION", entidades.getDireccion().toUpperCase(),
                        false);
            }
            if (entidades.getEmail() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.EMAIL", entidades.getEmail());
            }
            if (entidades.getNumCalle() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUM_CALLE", entidades.getNumCalle());
            }
            if (entidades.getNumTrabajadores() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUM_TRABAJADORES", entidades.getNumTrabajadores());
            }
            if (entidades.getNumTrabHombre() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUM_TRAB_HOMBRE", entidades.getNumTrabHombre());
            }
            if (entidades.getNumTrabMujer() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.NUM_TRAB_MUJER", entidades.getNumTrabMujer());
            }
            if (entidades.getTfno() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.TFNO", entidades.getTfno());
            }
            if (entidades.getCp() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.CP", entidades.getCp());
            }
            if (entidades.getTipoEntidad() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.TIPO_ENTIDAD", entidades.getTipoEntidad());
            }
            if (entidades.getSolicInfor() != null) {
                UtilSQL.createFilterSQL(where, params, "t1.SOLICINFOR", entidades.getSolicInfor());
            }
        }

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

        return mapWhere;
    }

    // CHECKSTYLE:ON CyclomaticComplexity - Generación de código de UDA
    /**
     * Returns a map with the needed value to create the conditions to filter by the Entidades
     * entity
     * 
     * @param entidades
     *            Entidades Bean with the criteria values to filter by.
     * @param startsWith
     *            Boolean
     * @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.
     */
    private Map<String, Object> getWhereLikeMap(Entidades entidades, Boolean startsWith) {

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

        if (entidades != null) {
            if (entidades.getCodentidad() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODENTIDAD", entidades.getCodentidad(), startsWith);
            }
            if (entidades.getTecnicosEntidad() != null) {
                if (entidades.getTecnicosEntidad().getCodtecnico() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t5.CODTECNICO",
                            entidades.getTecnicosEntidad().getCodtecnico(), startsWith);
                    where.append(" AND t5.CODENTIDAD = t1.CODENTIDAD ");
                }
                if (entidades.getTecnicosEntidad().getBaja() != null
                        && !Constantes.VALUE_TODOS_NUM.equalsIgnoreCase(String.valueOf(entidades.getBaja()))) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.BAJA", entidades.getTecnicosEntidad().getBaja(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getDocidentificacion() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.DOCIDENTIFICACION",
                            entidades.getTecnicosEntidad().getDocidentificacion(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getNombre() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.NOMBRE", entidades.getTecnicosEntidad().getNombre(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getApe1() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.APE1", entidades.getTecnicosEntidad().getApe1(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getApe2() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.APE2", entidades.getTecnicosEntidad().getApe2(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getTelefono1() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.TELEFONO1",
                            entidades.getTecnicosEntidad().getTelefono1(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getTelefono2() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.TELEFONO2",
                            entidades.getTecnicosEntidad().getTelefono2(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getEmail() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.EMAIL", entidades.getTecnicosEntidad().getEmail(),
                            startsWith);
                }

                if (entidades.getTecnicosEntidad().getSexo() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.SEXO", entidades.getTecnicosEntidad().getSexo(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getCalle() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.CALLE", entidades.getTecnicosEntidad().getCalle(),
                            startsWith);
                }
                if (entidades.getTecnicosEntidad().getNumcalle() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.NUMCALLE",
                            entidades.getTecnicosEntidad().getNumcalle(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getCodpostal() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.CODPOSTAL",
                            entidades.getTecnicosEntidad().getCodpostal(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getMunicipio() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.MUNICIPIO",
                            entidades.getTecnicosEntidad().getMunicipio(), startsWith);
                }
                if (entidades.getTecnicosEntidad().getProvincia() != null) {
                    UtilSQL.createFilterLikeSQL(where, params, "t2.PROVINCIA",
                            entidades.getTecnicosEntidad().getProvincia(), startsWith);
                }

                if (entidades.getTecnicosEntidad().getEntidadeses() != null
                        && !entidades.getTecnicosEntidad().getEntidadeses().isEmpty()) {
                    where.append(UtilSQL.AND);
                    where.append(" t5.CODENTIDAD IN (");
                    for (Entidades entidad : entidades.getTecnicosEntidad().getEntidadeses()) {
                        where.append("?,");
                        params.add(entidad.getCodentidad());
                    }
                    where = new StringBuilder(where.substring(0, where.length() - 1));
                    where.append(") ");
                }

                if (entidades.getTecnicosEntidad().getEntidadesesNoAsociadas() != null
                        && !entidades.getTecnicosEntidad().getEntidadesesNoAsociadas().isEmpty()) {
                    where.append(UtilSQL.AND);
                    where.append(" t1.CODENTIDAD NOT IN (");
                    for (Entidades entidad : entidades.getTecnicosEntidad().getEntidadesesNoAsociadas()) {
                        where.append("?,");
                        params.add(entidad.getCodentidad());
                    }
                    where = new StringBuilder(where.substring(0, where.length() - 1));
                    where.append(") ");
                }

            }
            if (entidades.getDesentidad() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.DESENTIDAD", entidades.getDesentidad(), startsWith);
            }
            if (entidades.getCifnif() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CIFNIF", entidades.getCifnif(), startsWith);
            }
            if (entidades.getCodth() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODTH", entidades.getCodth(), startsWith);
            }
            if (entidades.getCodmun() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.CODMUN", entidades.getCodmun(), startsWith);
            }
            if (entidades.getCodloc() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.LOCALIDAD", entidades.getCodloc(), startsWith);
            }
            if (entidades.getDireccion() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.DIRECCION", entidades.getDireccion(), startsWith);
            }
            if (entidades.getSolicInfor() != null) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.SOLICINFOR", entidades.getSolicInfor(), startsWith);
            }
            if (entidades.getBaja() != null
                    && !Constantes.VALUE_TODOS_NUM.equalsIgnoreCase(String.valueOf(entidades.getBaja()))) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.BAJA", entidades.getBaja(), startsWith);
            }
            if (entidades.getTipoEntidad() != null
                    && !Constantes.VALUE_TODOS_NUM.equalsIgnoreCase(String.valueOf(entidades.getTipoEntidad()))) {
                UtilSQL.createFilterLikeSQL(where, params, "t1.TIPO_ENTIDAD", entidades.getTipoEntidad(), startsWith);
            }
        }

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

        return mapWhere;
    }

}
