package com.ejie.ab61.dao.inspecciones;

import com.ejie.ab61.model.inspecciones.Inspecciones;
import com.ejie.x38.dao.RowNumResultSetExtractor;
import com.ejie.x38.dto.JQGridManager;
import com.ejie.x38.dto.JQGridManagerJerarquia;
import com.ejie.x38.dto.JQGridRequestDto;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableRowDto;
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;

/**
 * InspeccionesDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class InspeccionesDaoImpl implements InspeccionesDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "IDINSPECCION", "IDENTIFICADORINSPECCION",
			"IDRESULTADOINSPECCION", "IDDIRECCION", "IDEXPEDIENTE", "IDCAMPAINA", "IDESTADOINSPECCION",
			"VISITAADMINISTRATIVA", "OBJETOINSPECCION", "FECHALIMINSPECCION", "IDPROTOCOLO", "IDORIGENINSPECCION",
			"IDINSPECTOR", "FECHAREGISTRO", "USUARIOREGISTRO", "FECHAULTMODIFICACION", "USUARIOULTMODIFICACION",
			"IDTERCOMPARECIENTE", "CONDICIONCOMPARECIENTE", "FECHAASIGINSPECCION", "MOTIVODENEGACION",
			"OBSERVACIONESRESULTADO", "OBSERVACIONESCOMPARECIENTE" };

	private JdbcTemplate jdbcTemplate;

	/*
	 * ROW_MAPPERS
	 */
	private RowMapper<Inspecciones> rwMap = new RowMapper<Inspecciones>() {
		public Inspecciones mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			return new Inspecciones(resultSet.getInt("IDINSPECCION"), resultSet.getString("IDENTIFICADORINSPECCION"),
					resultSet.getInt("IDRESULTADOINSPECCION"), resultSet.getInt("IDDIRECCION"),
					resultSet.getInt("IDEXPEDIENTE"), resultSet.getInt("IDCAMPAINA"),
					resultSet.getLong("IDESTADOINSPECCION"), resultSet.getInt("VISITAADMINISTRATIVA"),
					resultSet.getString("OBJETOINSPECCION"), resultSet.getDate("FECHALIMINSPECCION"),
					resultSet.getInt("IDPROTOCOLO"), resultSet.getInt("IDORIGENINSPECCION"),
					resultSet.getInt("IDINSPECTOR"), resultSet.getDate("FECHAREGISTRO"),
					resultSet.getString("USUARIOREGISTRO"), resultSet.getDate("FECHAULTMODIFICACION"),
					resultSet.getString("USUARIOULTMODIFICACION"), resultSet.getInt("IDTERCOMPARECIENTE"),
					resultSet.getString("CONDICIONCOMPARECIENTE"), resultSet.getDate("FECHAASIGINSPECCION"),
					resultSet.getString("MOTIVODENEGACION"), resultSet.getString("OBSERVACIONESRESULTADO"),
					resultSet.getString("OBSERVACIONESCOMPARECIENTE"));
		}
	};

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

	/**
	 * Rowmapper para Jerarquía
	 *
	 * @param dataSource
	 *            DataSource
	 * @return
	 */
	private RowMapper<JerarquiaDto<Inspecciones>> rwMapJerarquia = new RowMapper<JerarquiaDto<Inspecciones>>() {
		public JerarquiaDto<Inspecciones> mapRow(ResultSet resultSet, int rowNum) throws SQLException {

			Inspecciones inspecciones = new Inspecciones(resultSet.getInt("IDINSPECCION"),
					resultSet.getString("IDENTIFICADORINSPECCION"), resultSet.getInt("IDRESULTADOINSPECCION"),
					resultSet.getInt("IDDIRECCION"), resultSet.getInt("IDEXPEDIENTE"), resultSet.getInt("IDCAMPAINA"),
					resultSet.getLong("IDESTADOINSPECCION"), resultSet.getInt("VISITAADMINISTRATIVA"),
					resultSet.getString("OBJETOINSPECCION"), resultSet.getDate("FECHALIMINSPECCION"),
					resultSet.getInt("IDPROTOCOLO"), resultSet.getInt("IDORIGENINSPECCION"),
					resultSet.getInt("IDINSPECTOR"), resultSet.getDate("FECHAREGISTRO"),
					resultSet.getString("USUARIOREGISTRO"), resultSet.getDate("FECHAULTMODIFICACION"),
					resultSet.getString("USUARIOULTMODIFICACION"), resultSet.getInt("IDTERCOMPARECIENTE"),
					resultSet.getString("CONDICIONCOMPARECIENTE"), resultSet.getDate("FECHAASIGINSPECCION"),
					resultSet.getString("MOTIVODENEGACION"), resultSet.getString("OBSERVACIONESRESULTADO"),
					resultSet.getString("OBSERVACIONESCOMPARECIENTE"));

			JerarquiaDto<Inspecciones> jerarquia = new JerarquiaDto<Inspecciones>();
			jerarquia.setModel(inspecciones);
			jerarquia.setLevel(resultSet.getBigDecimal("LEVEL").intValue());
			jerarquia.setParentNodes(resultSet.getString("PARENTNODES"));
			jerarquia.setIsLeaf(Boolean.parseBoolean(resultSet.getString("ISLEAF")));
			jerarquia.setFilter(Boolean.parseBoolean(resultSet.getString("FILTER")));
			return jerarquia;
		}
	};

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

	@Override
	public Inspecciones findByIdentificadorInspeccion(String identificadorInspeccion) {
		String query = "SELECT t1.ID_INSPECCION IDINSPECCION FROM AB79.INSPECCIONES t1 WHERE t1.IDENTIFICADOR_INSPECCION = ? ";
		List<Inspecciones> inspeccionesList = this.jdbcTemplate.query(query, this.rwMapPK, identificadorInspeccion);

		return (Inspecciones) DataAccessUtils.uniqueResult(inspeccionesList);
	}

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