package dao;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Types;
import java.util.ArrayList;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.SQLQuery;
import org.hibernate.annotations.OrderBy;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import bean.AppVariables;
import common.dao.GenericDAO;
import common.dao.IDAO;
import sicura.entities.IstruzioniEstrazioneDistinteBanca;

@Repository
public class IstruzioniEstrazioneDistinteBancaDAO 
		extends GenericDAO<IstruzioniEstrazioneDistinteBanca, Integer> 
		implements IDAO<IstruzioniEstrazioneDistinteBanca, Integer>{
			
		
	public List<IstruzioniEstrazioneDistinteBanca> getIstruzioni(Integer idPiano) {
		boolean tx = startTransaction();
		
		try {
			Criteria crit = currentSession().createCriteria(IstruzioniEstrazioneDistinteBanca.class);
			crit
				.add(Restrictions.eq("idpianoEstrazione", idPiano))
				.addOrder(Order.asc("rowNumber"));
			
			List<IstruzioniEstrazioneDistinteBanca> res = crit.list();
			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}
	
	public List<IstruzioniEstrazioneDistinteBanca> getIstruzioniNoTrasaction(Integer idPiano) {
		
		Criteria crit = currentSession().createCriteria(IstruzioniEstrazioneDistinteBanca.class);
		crit
			.add(Restrictions.eq("idpianoEstrazione", idPiano))
			.addOrder(Order.asc("rowNumber"));
		
		List<IstruzioniEstrazioneDistinteBanca> res = crit.list();
		
		return res;
	}
	
	
	public void zapIstruzioni(Integer idPiano, List<Integer> ids, AppVariables appVariables) {

		/*
		 CREATE PROC [dbo].[spUCBase_IstruzioniEstrazioneDistinteBanca_delete]
			@SecurityUserId VARCHAR(15),
			@SecurityGuid UNIQUEIDENTIFIER,
		
			@ID int
		 */
		try {
			Integer res = null;
			Connection connection = getConnection();
			
			CallableStatement proc;
			try {
				proc = connection.prepareCall("{? = call spUCBase_IstruzioniEstrazioneDistinteBanca_delete (?,?,?)}");
					
				proc.registerOutParameter(1, Types.VARCHAR);
				proc.setString(2, appVariables.getUserId());
				proc.setString(3, appVariables.getGuid());
				
				
				for (Integer id:ids) {
					proc.setObject(4, id);
					proc.execute();
					proc.getMoreResults();
						
					res = proc.getInt(1);
				}
		
			
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		} finally {
		}
			
	//		if (ids.size()>0) {
	//		String sql = "delete from IstruzioniEstrazioneDistinteBanca where idPianoEstrazione=:idPiano and id not in (:ids)";
	//		SQLQuery q = currentSession().createSQLQuery(sql);
	//		q.setParameter("idPiano", idPiano);
	//		q.setParameterList("ids", ids);
	//		q.executeUpdate();
	//	}
	

	}

	public Integer saveNoTransaction(IstruzioniEstrazioneDistinteBanca istruzione, AppVariables appVariables) throws Exception{
		/*
		 CREATE PROC [dbo].[spUCBase_IstruzioniEstrazioneDistinteBanca_update]
			@SecurityUserId VARCHAR(15),
			@SecurityGuid UNIQUEIDENTIFIER,
		
			@ID int,
			@IDPianoEstrazione int,
			@RowNumber int,
			@Tipologia varchar(30),
			@TipoDisposizione varchar(3),
			@Provenienza varchar(30),
			@FunzioneOrdinante varchar(50),
			@SignRangeImportoDa varchar(2),
			@RangeImportoDa float,
			@SignRangeImportoA varchar(2),
			@RangeImportoA float,
			@ImportoLimiteDistinta float,
			@MaxNumberDisposizioni varchar(10),
			@SearchBancaOrdinanteStep1 varchar(2),
			@SearchBancaOrdinanteStep2 varchar(2),
			@SearchBancaOrdinanteStep3 varchar(2),
			@SearchBancaOrdinanteStep4 varchar(2),
			@SearchBancaOrdinanteStep5 varchar(2),
			@SearchBancaOrdinanteStep6 varchar(2),
			@SearchBancaOrdinanteStep7 varchar(2),
			@SearchBancaOrdinanteStep8 varchar(2),
			@SearchBancaOrdinanteStep9 varchar(2),
			@SearchBancaOrdinanteStep10 varchar(2)
		 */
		try {
			Integer res = null;
			Connection connection = getConnection();
			
			CallableStatement proc;
			try {
				proc = connection.prepareCall("{? = call spUCBase_IstruzioniEstrazioneDistinteBanca_update (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
					
				proc.registerOutParameter(1, Types.VARCHAR);
				proc.setString(2, appVariables.getUserId());
				proc.setString(3, appVariables.getGuid());
				proc.setObject(4, istruzione.getId());
				proc.setObject(5, istruzione.getIdpianoEstrazione());
				proc.setObject(6, istruzione.getRowNumber());
				proc.setString(7, istruzione.getTipologia());
				proc.setString(8, istruzione.getTipoDisposizione());
				proc.setString(9, istruzione.getProvenienza());
				proc.setString(10, istruzione.getFunzioneOrdinante());
				proc.setString(11, istruzione.getSignRangeImportoDa());
				proc.setObject(12, istruzione.getRangeImportoDa());
				proc.setString(13, istruzione.getSignRangeImportoA());
				proc.setObject(14, istruzione.getRangeImportoA());
				proc.setObject(15, istruzione.getImportoLimiteDistinta());
				proc.setString(16, istruzione.getMaxNumberDisposizioni());
				proc.setString(17,istruzione.getSearchBancaOrdinanteStep1());
				proc.setString(18,istruzione.getSearchBancaOrdinanteStep2());
				proc.setString(19,istruzione.getSearchBancaOrdinanteStep3());
				proc.setString(20,istruzione.getSearchBancaOrdinanteStep4());
				proc.setString(21,istruzione.getSearchBancaOrdinanteStep5());
				proc.setString(22,istruzione.getSearchBancaOrdinanteStep6());
				proc.setString(23,istruzione.getSearchBancaOrdinanteStep7());
				proc.setString(24,istruzione.getSearchBancaOrdinanteStep8());
				proc.setString(25,istruzione.getSearchBancaOrdinanteStep9());
				proc.setString(26,istruzione.getSearchBancaOrdinanteStep10());
				
				
				proc.execute();
				proc.getMoreResults();
					
				res = proc.getInt(1);
					
				
			} catch (SQLException ex) {
				throw ex;
			}
			return res;
		} finally {
		}		
		
	}

}
