package com.ejie.ab79.dao.propuestaSancion;

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.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ab79.model.propuestaSancion.DerechosPropuesta;
import com.ejie.x38.dto.JerarquiaDto;
import com.ejie.x38.dto.TableManager;
import com.ejie.x38.dto.TableRequestDto;
import com.ejie.x38.dto.TableRowDto;

/**
 * ActuacionesDaoImpl  
 * 
 *  
 */

@Repository
@Transactional
public class PropuestaSancionDerechosDaoImpl implements PropuestaSancionDerechosDao {

	public static final String[] ORDER_BY_WHITE_LIST = new String[] { "ID_REL_ART_INF_PRO_SAN_DER",
			"ID_REL_ART_INF_PRO_SAN", "ID_DERECHO", "FECHA_REGISTRO", "USUARIO_REGISTRO" };

	private JdbcTemplate jdbcTemplate;

	@Resource
	public void setDataSource(DataSource dataSource) {
		this.jdbcTemplate = new JdbcTemplate(dataSource);
	}

	private RowMapper<DerechosPropuesta> rwMap = new RowMapper<DerechosPropuesta>() {
		@Override
		public DerechosPropuesta mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			DerechosPropuesta derechosPropuesta = new DerechosPropuesta();
			derechosPropuesta.setIdDerInfraccion(resultSet.getInt("IDRELARTINFPROSANDER"));
			derechosPropuesta.setIdInfraccionPropuesta(resultSet.getInt("IDRELARTINFPROSAN"));
			derechosPropuesta.setIdDerecho(resultSet.getInt("IDDERECHO"));
			derechosPropuesta.setFechaRegistro(resultSet.getDate("FECHAREGISTRO"));
			derechosPropuesta.setUsuarioRegistro(resultSet.getString("USUARIOREGISTRO"));
			return derechosPropuesta;
		}
	};

	private Map<String, ?> getWhereMap(DerechosPropuesta derechosPropuesta) {
		StringBuilder where = new StringBuilder(PropuestaSancionDerechosDaoImpl.STRING_BUILDER_INIT);
		List<Object> params = new ArrayList<Object>();

		if (derechosPropuesta != null && String.valueOf(derechosPropuesta.getIdDerecho()) != null
				&& derechosPropuesta.getIdDerecho() != 0) {
			where.append(" AND t1.ID_PROPUESTA_SANCION = ?");
			params.add(derechosPropuesta.getIdDerecho());
		}
		if (String.valueOf(derechosPropuesta.getIdDerInfraccion()) != null) {
			where.append(" AND t1.ID_REL_ART_INF_PRO_SAN = ?");
			params.add(derechosPropuesta.getIdDerInfraccion());
		}

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

		return mapWhere;
	}

	@Override
	public DerechosPropuesta add(DerechosPropuesta derechosPropuesta) {
		int derechoInfraccion = this.jdbcTemplate.queryForObject("SELECT AB79.S_AB7932T00.NEXTVAL FROM DUAL",
				Integer.class);
		derechosPropuesta.setIdDerInfraccion(derechoInfraccion);
		String query = "INSERT INTO REL_ART_INF_PRO_SAN_DER (ID_REL_ART_INF_PRO_SAN_DER, ID_REL_ART_INF_PRO_SAN,ID_DERECHO,FECHA_REGISTRO,USUARIO_REGISTRO) VALUES (?,?,?,?,?)";
		this.jdbcTemplate.update(query, derechosPropuesta.getIdDerInfraccion(),
				derechosPropuesta.getIdInfraccionPropuesta(), derechosPropuesta.getIdDerecho(),
				derechosPropuesta.getFechaRegistro(), derechosPropuesta.getUsuarioRegistro());
		return derechosPropuesta;
	}

	@Override
	public DerechosPropuesta update(DerechosPropuesta derechosPropuesta) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public DerechosPropuesta find(DerechosPropuesta derechosPropuesta) {
		// TODO Auto-generated method stub
		return null;
	}

	@Transactional
	public void remove(DerechosPropuesta derechosPropuesta) {
		String query = "DELETE FROM REL_ART_INF_PRO_SAN_DER WHERE ID_REL_ART_INF_PRO_SAN=? ";
		this.jdbcTemplate.update(query, derechosPropuesta.getIdDerInfraccion());
	}

	@Override
	public List<DerechosPropuesta> findAll(DerechosPropuesta derechosPropuesta, TableRequestDto tableRequestDto) {

		StringBuilder query = new StringBuilder(
				"SELECT t1.ID_REL_ART_INF_PRO_SAN_DER IDRELARTINFPROSANDER, t1.ID_REL_ART_INF_PRO_SAN IDRELARTINFPROSAN, "
						+ "t1.ID_DERECHO IDDERECHO, t1.FECHA_REGISTRO FECHAREGISTRO,t1.USUARIO_REGISTRO USUARIOREGISTRO");
		query.append(" FROM REL_ART_INF_PRO_SAN_DER t1");

		// Where clause & params

		Map<String, ?> mapaWhere = this.getWhereMap(derechosPropuesta);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

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

		if (tableRequestDto != null) {
			query = TableManager.getPaginationQuery(tableRequestDto, query,
					PropuestaSancionDaoImpl.ORDER_BY_WHITE_LIST);
		}

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

	@Override
	public List<DerechosPropuesta> findAllLike(DerechosPropuesta derechosPropuesta, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void removeMultiple(DerechosPropuesta filterDerechosPropuesta, TableRequestDto tableRequestDto,
			Boolean startsWith) {
		// TODO Auto-generated method stub

	}

	@Override
	public Long findAllLikeCount(DerechosPropuesta derechosPropuesta, Boolean startsWith) {
		// TODO Auto-generated method stub
		return null;
	}

	@Transactional(readOnly = true)
	public Long findAllCount(DerechosPropuesta derechosPropuesta) {
		StringBuilder query = new StringBuilder("SELECT COUNT(1) FROM REL_ART_INF_PRO_SAN_DER t1");
		// where clause & params
		Map<String, ?> mapaWhere = this.getWhereMap(derechosPropuesta);
		StringBuilder where = new StringBuilder(" WHERE 1=1 ");
		where.append(mapaWhere.get("query"));
		query.append(where);

		List<?> params = (List<?>) mapaWhere.get("params");
		return this.jdbcTemplate.queryForObject(query.toString(), params.toArray(), Long.class);

	}

	@Override
	public List<TableRowDto<DerechosPropuesta>> reorderSelection(DerechosPropuesta filterDerechosPropuesta,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<TableRowDto<DerechosPropuesta>> search(DerechosPropuesta filterDerechosPropuesta,
			DerechosPropuesta searchDerechosPropuesta, TableRequestDto tableRequestDto, Boolean startsWith) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<JerarquiaDto<DerechosPropuesta>> findAllLikeJerarquia(DerechosPropuesta filterDerechosPropuesta,
			TableRequestDto tableRequestDto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public Long findAllLikeCountJerarquia(DerechosPropuesta filterDerechosPropuesta, TableRequestDto tableRequestDto) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public List<TableRowDto<DerechosPropuesta>> findAllChild(DerechosPropuesta filterDerechosPropuesta,
			TableRequestDto tableRequestDto) {

		return null;
	}

	@Override
	public List<DerechosPropuesta> getMultiple(DerechosPropuesta filterDerechosPropuesta,
			TableRequestDto tableRequestDto, Boolean startsWith) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public int numeroDocumentosAsociados(DerechosPropuesta actuacion) {
		// TODO Auto-generated method stub
		return 0;
	}

	public static final int STRING_BUILDER_INIT = 4096;

	/**
	 * 
	 * @param idInfraccion
	 *            Integer
	 */
	@Override
	public void removeByInfraccion(Integer idInfraccion) {

		String query = "DELETE FROM REL_ART_INF_PRO_SAN_DER WHERE ID_REL_ART_INF_PRO_SAN = ? ";

		this.jdbcTemplate.update(query, idInfraccion);
	}
}
