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.SQLQuery;
import org.springframework.stereotype.Repository;

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

@Repository
public class PianiEstrazioneTipoFlussoDao extends GenericDAO<PianiEstrazioneDistinteBancaTipoFlusso, Integer> implements IDAO<PianiEstrazioneDistinteBancaTipoFlusso, Integer> {

	public List<PianiEstrazioneDistinteBancaTipoFlusso> listFor(Integer idPiano) {
		
		boolean tx = startTransaction();
		try {
			String sql = "Select * from PianiEstrazioneDistinteBanca_TipoFlusso WHERE PianiEstrazioneDistinteBancaID=:idPiano ORDER BY ID ASC";
			
			SQLQuery q = currentSession().createSQLQuery(sql);
			q
				.addEntity(PianiEstrazioneDistinteBancaTipoFlusso.class)
				.setParameter("idPiano", idPiano);
	
			List<PianiEstrazioneDistinteBancaTipoFlusso> res = q.list();
			
			
	//		Criteria crit = currentSession().createCriteria(VdelegatoFirmaEstrattoreDistinte.class);
	//		//crit
	//		//	.addOrder(Order.asc("id.importoLimiteFirma"));
	//	    	
	//		//  res.get(0).getId()
	//		
	//		List<VdelegatoFirmaEstrattoreDistinte> res = crit.list();
		    
		    return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}

	public PianiEstrazioneDistinteBancaTipoFlusso newInstance(Integer idPiano) {
		PianiEstrazioneDistinteBancaTipoFlusso res = new PianiEstrazioneDistinteBancaTipoFlusso();
		res.setPianiEstrazioneDistinteBancaId(idPiano);
		return res;
	}

	public Integer delete(Integer id, AppVariables appVariables) {
		/*
		 CREATE PROC [dbo].[spUCBase_PianiEstrazioneDistinteBanca_delete]
			@SecurityUserId VARCHAR(15),
			@SecurityGuid UNIQUEIDENTIFIER,
		
			@ID int
		 */

		boolean tx = startTransaction();
		try {

			Integer res = null;
			Connection connection = getConnection();
			CallableStatement proc;
			try {
				proc = connection.prepareCall("{? = call spUCBase_PianiEstrazioneDistinteBanca_TipoFlusso_delete (?,?,?)}");
					
				proc.registerOutParameter(1, Types.VARCHAR);
				proc.setString(2, appVariables.getUserId());
				proc.setString(3, appVariables.getGuid());
				proc.setObject(4, id);
				
				proc.execute();
				proc.getMoreResults();
					
				res = proc.getInt(1);
					
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
				return null;
			}
			
			return res;
			
			
		} finally {
			if (tx)
				tx = commit();
		}
	}

	public boolean save(Integer idPiano, List<PianiEstrazioneDistinteBancaTipoFlusso> pianiEstrazioneDistinteBancaTipoFlusso, List<Integer> idCancellati, AppVariables appVariables) {
		boolean tx = startTransaction();
		try {
			boolean res;
			
			try {
				for(Integer id: idCancellati)
					delete(id, appVariables);
				
				for (PianiEstrazioneDistinteBancaTipoFlusso opzione: pianiEstrazioneDistinteBancaTipoFlusso)
					save(opzione, appVariables);
				
				res = true;
			} catch (Exception ex) {
				ex.printStackTrace();
				res = false;
				if (tx)
					tx = rollback();
			}			
			return res;
		} finally {
			if (tx)
				tx = commit();
		}
	}

	private void save(PianiEstrazioneDistinteBancaTipoFlusso opzione, AppVariables appVariables) {
		/* 
		 CREATE PROC [dbo].[spUCBase_PianiEstrazioneDistinteBanca_TipoFlusso_update]
			@SecurityUserId VARCHAR(15),
			@SecurityGuid UNIQUEIDENTIFIER,
		
			@ID int,
			@PianiEstrazioneDistinteBancaID int,
			@TipologiaEstrazione int,
			@ABIOrdinante varchar(5),
			@Attivo bit,
			@Valore varchar(255)
		 */
		
		boolean tx = startTransaction();
		try {

			Integer res = null;
			Connection connection = getConnection();				

			CallableStatement proc;
			try {
				proc = connection.prepareCall("{? = call spUCBase_PianiEstrazioneDistinteBanca_TipoFlusso_update (?,?,?,?,?,?,?,?)}");
					
				proc.registerOutParameter(1, Types.VARCHAR);
				proc.setString(2, appVariables.getUserId());
				proc.setString(3, appVariables.getGuid());
				proc.setObject(4, opzione.getId());
				proc.setObject(5, opzione.getPianiEstrazioneDistinteBancaId());
				proc.setObject(6, opzione.getTipologiaEstrazione());
				proc.setString(7, opzione.getAbiordinante());
				proc.setBoolean(8, opzione.isAttivo());
				proc.setString(9, opzione.getValore());
				
				proc.execute();
				proc.getMoreResults();
					
				res = proc.getInt(1);
					
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
		} finally {
			if (tx)
				tx = commit();
		}
		
	}

}
