package com.ejie.ab39a.dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.model.Entidades;
import com.ejie.ab39a.model.PlanesEstrategicos;
import com.ejie.ab39a.model.TecnicosEntidad;
import com.ejie.ab39a.util.Constantes;
import com.ejie.ab39a.util.UtilSQL;

/**
 * 
 *  
 *
 */
@Repository 
@Transactional
public class PlanEstrategicoDaoImpl implements PlanEstrategicoDao{
	
	private static final Logger logger= LoggerFactory.getLogger(PlanEstrategicoDaoImpl.class);
	
	private JdbcTemplate jdbcTemplate;
	
	
	private RowMapper<PlanesEstrategicos> rwMap = new RowMapper<PlanesEstrategicos>() {
		@Override
		public PlanesEstrategicos mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			PlanesEstrategicos planesEstrategicos = new PlanesEstrategicos();
			Entidades entidades = new Entidades();
			planesEstrategicos.setEntidad(entidades);
			planesEstrategicos.getEntidad().setCodentidad(resultSet.getInt("CODENTIDAD"));
			planesEstrategicos.getEntidad().setDesentidad(resultSet.getString("DESENTIDAD"));
			
			planesEstrategicos.setCodplane(resultSet.getInt("CODPLANE"));
			planesEstrategicos.setNombre(resultSet.getString("NOMBRE"));
			planesEstrategicos.setNombreeus(resultSet.getString("NOMBREEUS"));
			
			return planesEstrategicos;
		}
	};
	
	private RowMapper<TecnicosEntidad> rwMapTecnicos = new RowMapper<TecnicosEntidad>() {
		@Override
		public TecnicosEntidad mapRow(ResultSet resultSet, int rowNum) throws SQLException {
			TecnicosEntidad tecnicosEntidad = new TecnicosEntidad();
			tecnicosEntidad.setCodtecnico(resultSet.getInt("CODTECNICO"));
			tecnicosEntidad.setEmail(resultSet.getString("EMAIL"));
			return tecnicosEntidad;
		}
	};
	
	
	/**
     * Method use to set the datasource.
     *
     * @param dataSource DataSource
     * @return
     */
    @Resource
    public void setDataSource(DataSource dataSource) {
    	this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
	

    /**
	 * 
	 * @return Long
	 */
    @Override
    @Transactional(readOnly=true)
	public Long getPlanesEstrategicosCount(){
    	PlanEstrategicoDaoImpl.logger.debug("Entrando");
		StringBuilder str = new StringBuilder(Constantes.STRING_BUILDER_INIT);
		
		str.append("SELECT nvl(count(1),0) as cuenta FROM PLANIFICACION");
		
		PlanEstrategicoDaoImpl.logger.debug("SQL:".concat(str.toString()));
		
		@SuppressWarnings("deprecation")
		Long cuenta = this.jdbcTemplate.queryForLong(str.toString());
		
		PlanEstrategicoDaoImpl.logger.debug("Saliendo:".concat(String.valueOf(cuenta)));
		
		return cuenta;
	}
    
    /**
	 * 
	 * @return Long
	 */
    @Override
    @Transactional(readOnly=true)
	public List<PlanesEstrategicos> getPlanesEstrategicos(Integer mesesAntes){
    	PlanEstrategicoDaoImpl.logger.debug("Entrando en getPlanesEstrategicos");
		StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
		
		query.append("SELECT t1.CODPLANE CODPLANE,t1.CODVERSION CODVERSION, t1.CODENTIDAD CODENTIDAD,t1.ANYOINICIO ANYOINICIO,t1.ANYOFIN ANYOFIN,t1.ACTIVO ACTIVO,t1.NOMBRE NOMBRE,t1.NOMBREEUS NOMBREEUS, t3.DESENTIDAD DESENTIDAD ");
		query.append(" FROM PLANES_ESTRATEGICOS t1, ENTIDADES t3 ");
		query.append(" WHERE t1.CODVERSION IN (SELECT MAX(t2.CODVERSION) FROM PLANES_ESTRATEGICOS t2 WHERE t2.CODPLANE = t1.CODPLANE) ");
		query.append(" AND t1.ACTIVO = 1 AND t1.CODENTIDAD = t3.CODENTIDAD ");
		query.append(" AND anyofin=TO_NUMBER(to_char(sysdate,'YYYY')) and months_between(to_date('31/12/'||anyofin,'DD/MM/YYYY'),sysdate)<".concat(String.valueOf(mesesAntes)));
		query.append(" ORDER BY t1.ANYOFIN ASC ");
		PlanEstrategicoDaoImpl.logger.debug("SQL:".concat(query.toString()));
		
		List<PlanesEstrategicos> listaPlantesEstrategicos = this.jdbcTemplate.query(query.toString(), this.rwMap);
		
		PlanEstrategicoDaoImpl.logger.debug("Saliendo de getPlanesEstrategicos");
		
		return listaPlantesEstrategicos;
	}
    
    @Override
    @Transactional(readOnly=true)
    public List<TecnicosEntidad> getTecnicosEntidad(PlanesEstrategicos planes){
    	PlanEstrategicoDaoImpl.logger.debug("Entrando en getTecnicosEntidad");
		StringBuilder query = new StringBuilder(Constantes.STRING_BUILDER_INIT);
		
		query.append("SELECT t1.CODTECNICO CODTECNICO,t1.EMAIL EMAIL ");
		query.append(" FROM TECNICOS_ENTIDAD t1, ENTIDAD_TECNICO t2,PLANESESTR_TECNICOS t3 ");
		query.append(" WHERE t2.CODTECNICO = t1.CODTECNICO ");
		query.append(" AND t1.CODTECNICO   = t3.CODTECNICO ");
				
		List<Object> params = new ArrayList<Object>();
		UtilSQL.createFilterSQL(query, params, "t2.CODENTIDAD", planes.getEntidad().getCodentidad());
		UtilSQL.createFilterSQL(query, params, "t3.CODPLANE", planes.getCodplane());
		
    	List<TecnicosEntidad> listaTecnicosEntidad = this.jdbcTemplate.query(query.toString(), this.rwMapTecnicos, params.toArray());
    	
    	PlanEstrategicoDaoImpl.logger.debug("Saliendo de getTecnicosEntidad");
    	
    	return listaTecnicosEntidad;
    }

}
