package controller.rest;

import java.io.InputStream;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.io.IOUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.HttpClientErrorException;

import com.fasterxml.jackson.databind.ObjectMapper;

import bean.AppVariables;
import bean.BeanSelect;
import bean.DisposizioniBonificiBean;
import bean.FiltroRicerceComplesse;
import bean.LogModificheBean;
import bean.MotivazioneRichiamoBean;
import bean.filters.DisposizioniFiltroBean;
import bean.filters.RicercaDisposizioniFilterBean;
import bean.query.DisposizioniAeaDecoded;
import bean.query.DisposizioniBonificiDecoded;
import common.controller.BaseController;
import dao.DisposizioniBonificiDAO;
import dao.DistintaBancaDAO;
import dao.GenericComboDAO;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import sicura.entities.DisposizioniBonifici;
import sicura.entities.DisposizioniBonificiConTipologia;
import sicura.entities.DistintaBanca;
import utils.ConvalidaClass;
import utils.DettaglioErrori;

@Controller
@RequestMapping("DisposizioniBonifici")
public class DisposizioniBonificiRestController extends BaseController {

	private final double ImportoLimiteBIR = 500000.01;
	
	@Autowired
	DisposizioniBonificiDAO disposizioniBonificiDAO;
	
	@Autowired
	DistintaBancaDAO distintaBancaDAO;
	
	@Autowired
	GenericComboDAO genericComboDAO;
	
	@Autowired
	ConvalidaClass convalidaClass;

	@RequestMapping(value="/{id}",method=RequestMethod.GET)
	@ResponseBody
	private ResponseEntity<Object> get(@PathVariable("id") Integer id, HttpServletRequest request) {
		try {
			setRequest(request);
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			if(getUserData()==null)
				return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
			else
				return new ResponseEntity<Object>(disposizioniBonificiDAO.read(id), HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<Object>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
			
	@RequestMapping(value="",method=RequestMethod.POST)
	@ResponseBody
	private ResponseEntity<Object> save(HttpServletRequest request, @RequestBody DisposizioniBonifici disposizioneBonifici) {
	 	try {
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
			else {
	
				AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
				Integer res = -1;
				boolean tx = disposizioniBonificiDAO.startTransaction();		
				try {
					disposizioneBonifici = disposizioniBonificiDAO.fixDisposizione(disposizioneBonifici);
					
					ObjectMapper oMapper = new ObjectMapper();
					Map<String, Object> disposizione = oMapper.convertValue(disposizioneBonifici, Map.class);
					
					try {
						DettaglioErrori errori = convalidaClass.eseguiConvalida(appVariables, 1, "BONIFICI",disposizione, true, false);
						 disposizioneBonifici = oMapper.convertValue(disposizione, DisposizioniBonifici.class);
					} catch (Exception e) {
						// TODO Auto-generated catch block  disposizione.get("importo")   disposizione.get("flagImporto") disposizioneRid.isFlagImporto()
						e.printStackTrace();
					}
					
					
					res = disposizioniBonificiDAO.saveDisposizione(disposizioneBonifici, getUserData(), appVariables, convalidaClass);
				} finally {
					if (tx)
						disposizioniBonificiDAO.commit();
				}
				
				if (res!=0)
					return new ResponseEntity<Object> (res, HttpStatus.INTERNAL_SERVER_ERROR);
			}
			
			return new ResponseEntity<Object> (disposizioneBonifici, HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<Object>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
	
 
 	@RequestMapping(value="/massDelete",method=RequestMethod.POST)
	@ResponseBody
	private ResponseEntity<Boolean> cancellazioneMassiva(HttpServletRequest request, @RequestBody DisposizioniFiltroBean disposizioniFiltroBean){
		Boolean res = false;
		try {
			setRequest(request);
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			if(getUserData()==null)
				return new ResponseEntity<Boolean>(HttpStatus.UNAUTHORIZED);
			else 
				res = disposizioniBonificiDAO.cancellazioneMassiva(disposizioniFiltroBean, getUserData().getOtherCode(), getUserData(), appVariables);
			
			}
		finally {
			
		}
		return new ResponseEntity<Boolean>(res, HttpStatus.OK);
	}
 
	private String recuperaBanca(String codiceAbiDestinatario) {
		// TODO Auto-generated method stub
		return null;
	}

	@RequestMapping(value="/list/{start:[\\d]+}-{length:[\\d]+}")
	@ResponseBody
	private ResponseEntity<List<DisposizioniBonifici>> list(HttpServletRequest request, 
				@PathVariable("start") int startFrom, 
				@PathVariable("length") int length,
				@RequestParam(value="orderField", required=false) String orderField,
				@RequestBody DisposizioniFiltroBean disposizioniFiltroBean) {
		try {
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<List<DisposizioniBonifici>>(HttpStatus.UNAUTHORIZED);
			else {
				AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
				return new ResponseEntity<List<DisposizioniBonifici>>(disposizioniBonificiDAO.list(startFrom,length,disposizioniFiltroBean, appVariables), HttpStatus.OK);
			}
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
	
	@RequestMapping(value="/export",method=RequestMethod.POST)
	private void export(@RequestBody DisposizioniFiltroBean disposizioniFiltroBean, HttpServletRequest request,HttpServletResponse response) throws Exception {
		setRequest(request);
		AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
		if(getUserData()==null)
			response.sendError(401); // UNAUTHORIZED
		else {
			List<String> res= disposizioniBonificiDAO.export(disposizioniFiltroBean,appVariables);
			if (res.size()>1) {
				response.setContentType("text/csv");
				response.setHeader("Content-Disposition","attachment;filename=export.csv");
				ServletOutputStream out = response.getOutputStream();
				for (String str: res)
					out.println(str);
			    out.flush();
			    out.close();
			} else {
				response.setStatus(404); // not found
			}
		} 
	}

	@RequestMapping(value="/exportFiltered",method=RequestMethod.POST)
	private void exportFiltered(@RequestBody RicercaDisposizioniFilterBean ricercaDisposizioniFilterBean, HttpServletRequest request,HttpServletResponse response) throws Exception {
		setRequest(request);
		AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
		if(getUserData()==null)
			response.sendError(401); // UNAUTHORIZED
		else {
			List<String> res= disposizioniBonificiDAO.exportFiltered(ricercaDisposizioniFilterBean,getUserData().getOtherCode(), appVariables,getUserData().getLogin());
			if (res.size()>1) {
				response.setContentType("text/csv");
				response.setHeader("Content-Disposition","attachment;filename=export.csv");
				ServletOutputStream out = response.getOutputStream();
				for (String str: res)
					out.println(str);
			    out.flush();
			    out.close();
			} else {
				response.setStatus(404); // not found
			}
		} 
	}

	
	@RequestMapping(value="/count")
	@ResponseBody
	private ResponseEntity<Integer> count(@RequestBody DisposizioniFiltroBean disposizioniFiltroBean, HttpServletRequest request) {
		try{
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<Integer>(HttpStatus.UNAUTHORIZED);
			else {
				AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
				return new ResponseEntity<Integer>(disposizioniBonificiDAO.count(disposizioniFiltroBean,appVariables), HttpStatus.OK);
			}
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<Integer>(0, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
		
	@RequestMapping(value="/filter/{start:[\\d]+}-{length:[\\d]+}")
	@ResponseBody
	private ResponseEntity<Object> filter(
			@PathVariable("start") int startFrom, 
			@PathVariable("length") int length,
			@RequestParam(value="orderField", required=false) String orderField,
			@RequestBody FiltroRicerceComplesse filtro, 
			HttpServletRequest request) {
		try {
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
			else
				return new ResponseEntity<Object>(disposizioniBonificiDAO.filter(startFrom, length, orderField, filtro.getFiltroRicerca(), filtro.getFiltro()),HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<Object>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
	
	
	@RequestMapping(value="/countfilter")
	@ResponseBody
	private ResponseEntity<Integer> countFilter(@RequestBody FiltroRicerceComplesse filtro, HttpServletRequest request) {
		try {
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<Integer>(HttpStatus.UNAUTHORIZED);
			else
				return new ResponseEntity<Integer>(disposizioniBonificiDAO.countFilter(filtro.getFiltroRicerca(), filtro.getFiltro()),HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<Integer>(0, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
	

	@RequestMapping(value="/logStati/{id}")
	@ResponseBody
	private ResponseEntity<List<LogModificheBean>> logStati(HttpServletRequest request, @PathVariable("id") Integer id) {
		try {
			setRequest(request);
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			if(getUserData()==null)
				return new ResponseEntity<List<LogModificheBean>>(HttpStatus.UNAUTHORIZED);
			else
				return new ResponseEntity<List<LogModificheBean>>(disposizioniBonificiDAO.logStati(id), HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}

	@RequestMapping(value="/logVariazioni/{id}")
	@ResponseBody
	private ResponseEntity<List<LogModificheBean>> logVariazioni(HttpServletRequest request, @PathVariable("id") Integer id) {
		try {
			setRequest(request);
			if(getUserData()==null)
				return new ResponseEntity<List<LogModificheBean>>(HttpStatus.UNAUTHORIZED);
			else
				return new ResponseEntity<List<LogModificheBean>>(disposizioniBonificiDAO.logVariazioni(id), HttpStatus.OK);
		} catch(Exception ex) {
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			ex.printStackTrace();
			Logger.getRootLogger().error((appVariables!=null? appVariables.getUserId(): "utente sconosciuto: ") + ex);
			return new ResponseEntity<>(null, HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}
	
	@RequestMapping(value="/print",method=RequestMethod.POST)
	private void print(@RequestBody DisposizioniFiltroBean disposizioniFiltroBean, HttpServletRequest request,HttpServletResponse response) throws Exception {
		setRequest(request);
		AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
		if(getUserData()==null)
			response.sendError(401); // UNAUTHORIZED
		else {
			List<DisposizioniBonificiDecoded> disposizioni = disposizioniBonificiDAO.listDecoded(disposizioniFiltroBean, appVariables);
			JRDataSource dsDisposizioni = new JRBeanCollectionDataSource(disposizioni);
			
			if (disposizioni.size()>0) {
				
	//			JasperDesign design = JRXmlLoader.load(request.getSession().getServletContext().getRealPath("/")+"Reports/repDisposizioniRid.jrxml");
	//			JasperReport report =  JasperCompileManager.compileReport(design);
				HashMap<String, Object> reportParams = new HashMap<String, Object>();
				String appPath = request.getSession().getServletContext().getRealPath("/");
				if (!appPath.endsWith("/"))
					appPath += "/";
				
				if ("DistinteBanca".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) {
					DistintaBanca distinta = distintaBancaDAO.getByIdDistintaBanca(disposizioniFiltroBean.getIdDistintaBanca());
					if (distinta!=null) {
						if (distinta.getDenominazioneDelegatoFirma()!=null)
							reportParams.put("delegatoAllaFirma", "Delegato alla firma: " + distinta.getDenominazioneDelegatoFirma());
						if(distinta.getTipologiaDbgrid().equalsIgnoreCase("SCT"))
							reportParams.put("titoloReport","Stampa Bonifici SCT");
						else if(distinta.getTipologiaDbgrid().equalsIgnoreCase("DOM"))
							reportParams.put("titoloReport","Stampa Bonifici Domiciliati");
						else if(distinta.getTipologiaDbgrid().equalsIgnoreCase("SCT_ESTERI"))
							reportParams.put("titoloReport","Stampa Bonifici SCT Esteri");
						else if(distinta.getTipologiaDbgrid().equalsIgnoreCase("ASSEGNI_INTESA"))
							reportParams.put("titoloReport","Stampa Assegni Banca Intesa");
						else
							reportParams.put("titoloReport","Stampa Bonifici");
						
						reportParams.put("numeroDistinta","N. distinta banca: "+  distinta.getIddistintaBanca());
						reportParams.put("flagBir", distinta.isFlagBir());
						reportParams.put("abiCabConto", String.format("ABI: %s CAB: %s Conto: %s", 
								(distinta.getCodiceAbiOrdinante()!=null?	distinta.getCodiceAbiOrdinante():" "), 
								(distinta.getCabOrdinante()!=null?distinta.getCabOrdinante(): " "),
								(distinta.getContoOrdinante()!=null?distinta.getContoOrdinante(): " ")));
						reportParams.put("checkimage", appPath+"img/checkbox.png");
						reportParams.put("uncheckimage",appPath+"img/uncheckbox.png");
						
					}
				} else {
					if ("ListaDisposizioniDom".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) 
						reportParams.put("titoloReport","Stampa Bonifici Domiciliati");
					else if ("ListaDisposizioniEst".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) 
						reportParams.put("titoloReport","Stampa Bonifici SCT Esteri");
					else if ("assegniIntesa".equalsIgnoreCase(disposizioniFiltroBean.getTipoChiamata())) 
						reportParams.put("titoloReport","Stampa Assegni Banca Intesa");
					else
						reportParams.put("titoloReport","Stampa Bonifici SCT");
				}
				
				
				java.util.Locale locale = new Locale( "it", "IT" );
				reportParams.put( JRParameter.REPORT_LOCALE, locale );
				
				ServletOutputStream out = response.getOutputStream();
				
				JasperPrint jasperPrint = JasperFillManager.fillReport(appPath+"Reports/repDisposizioniBonifici.jasper" ,reportParams, dsDisposizioni);
				JasperExportManager.exportReportToPdfStream(jasperPrint, out);
				
				response.setContentType("application/pdf");
				response.setHeader("Content-Disposition","attachment;filename=DisposizioniBonifici.pdf");
				
			    out.flush();
			    out.close();
			} else {
				response.setStatus(404); // not found	
			}
		}
	}

	@RequestMapping(value="/printFiltered",method=RequestMethod.POST)
	private void printFiltered(@RequestBody RicercaDisposizioniFilterBean ricercaDisposizioniFilterBean, HttpServletRequest request,HttpServletResponse response) throws Exception {
		setRequest(request);
		AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
		if(getUserData()==null)
			response.sendError(401); // UNAUTHORIZED
		else {
			List<DisposizioniBonificiDecoded> disposizioni = disposizioniBonificiDAO. filterDecoded(ricercaDisposizioniFilterBean);
			if (disposizioni.size()>0) {
				JRDataSource dsDisposizioni = new JRBeanCollectionDataSource(disposizioni);
				
				//JasperDesign design = JRXmlLoader.load(request.getSession().getServletContext().getRealPath("/") + "Reports/repDisposizioniRid.jrxml");
				//JasperReport report = JasperCompileManager.compileReport(design);
				HashMap reportParams = new HashMap();
				
				String appPath = request.getSession().getServletContext().getRealPath("/");
				if (!appPath.endsWith("/"))
					appPath += "/";
				
				java.util.Locale locale = new Locale( "it", "IT" );
				reportParams.put( JRParameter.REPORT_LOCALE, locale );

				
				
				if ("Pagamenti DOM".equalsIgnoreCase(ricercaDisposizioniFilterBean.getTipoDisposizione())) 
					reportParams.put("titoloReport","Stampa Bonifici Domiciliati");
				else if ("Pagamenti SCT Esteri".equalsIgnoreCase(ricercaDisposizioniFilterBean.getTipoDisposizione()))
					reportParams.put("titoloReport","Stampa Bonifici SCT Esteri");
				else if("Assegni Intesa".equalsIgnoreCase(ricercaDisposizioniFilterBean.getTipoDisposizione()))
					reportParams.put("titoloReport","Stampa Bonifici Asssegni Intesa");
				else reportParams.put("titoloReport","Stampa Bonifici");

				
				JasperPrint jasperPrint = JasperFillManager.fillReport(appPath + "Reports/repDisposizioniBonifici.jasper" ,reportParams, dsDisposizioni);
				JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
				
				response.setContentType("application/pdf");
				response.setHeader("Content-Disposition","attachment;filename=DisposizioniBonifici.pdf");
				ServletOutputStream out = response.getOutputStream();
			    out.flush();
			    out.close();
			} else {
				response.setStatus(404); // not found
			}			    
		} 
	}
	
	@RequestMapping(value="/stampaContabile/{id}",method=RequestMethod.GET)
	private void stampaContabile(@PathVariable("id") Integer id, HttpServletRequest request,HttpServletResponse response) throws Exception {
			setRequest(request);
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			if(getUserData()==null)
				response.sendError(401); // UNAUTHORIZED
			else {
				DisposizioniBonifici disposizione = disposizioniBonificiDAO.read(id);
				if (disposizione!=null) {
					java.util.Locale locale = new Locale( "it", "IT" );
					
					String appPath = request.getSession().getServletContext().getRealPath("/");
					if (!appPath.endsWith("/"))
						appPath += "/";
					
					HashMap reportParams = new HashMap();
					reportParams.put( JRParameter.REPORT_LOCALE, locale );
					
					List<DisposizioniBonifici> disposizioni = new ArrayList<DisposizioniBonifici>();
					disposizioni.add(disposizione);
					
				// Recupera la tipologia
					
					List<BeanSelect> esiti= genericComboDAO.getComboValues("Combo_Disposizioni", "BONIFICI", "Esito");
					String esito = "";
					for(BeanSelect select: esiti) {
						if (select.getCodice()==null && disposizione.getEsito()==null) {
							esito = select.getDescrizione();
							break;
						} else
							if (select.getCodice()!=null && select.getCodice().equals(disposizione.getEsito())) {
								esito = select.getDescrizione();
								break;
							}
					}
					
					reportParams.put("esito", esito);
					reportParams.put("logo", appPath+"img/findomestic-logo-stampe.jpg");
					JRDataSource dsDisposizioni = new JRBeanCollectionDataSource(disposizioni);
					JasperPrint jasperPrint = JasperFillManager.fillReport(appPath + "Reports/RicevutaBonificoSEPA.jasper", reportParams, dsDisposizioni);
					JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
					
					response.setContentType("application/pdf");
					response.setHeader("Content-Disposition","attachment;filename=RicevutaBonificoSEPA.pdf");
					ServletOutputStream out = response.getOutputStream();
				    out.flush();
				    out.close();
				} else {
					response.setStatus(404); // not found
				}			    							
			}
				
	}
	
	@RequestMapping(value="/stampaRichiamo/{id}",method=RequestMethod.POST)
	private void stampaRichiamo(@PathVariable("id") Integer id, @RequestBody MotivazioneRichiamoBean motivazioneRichiamoBean, HttpServletRequest request,HttpServletResponse response) throws Exception {
			setRequest(request);
			AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
			if(getUserData()==null)
				response.sendError(401); // UNAUTHORIZED
			else {
				DisposizioniBonifici disposizione = disposizioniBonificiDAO.read(id);
				if (disposizione!=null) {
					java.util.Locale locale = new Locale( "it", "IT" );
					
					String appPath = request.getSession().getServletContext().getRealPath("/");
					if (!appPath.endsWith("/"))
						appPath += "/";
					
					SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
					HashMap reportParams = new HashMap();
					reportParams.put( JRParameter.REPORT_LOCALE, locale );
					reportParams.put("checkimage", appPath+"img/checkbox.png");
					reportParams.put("uncheckedimage", appPath+"img/uncheckbox.png");
					reportParams.put("firma", appPath+"img/firmaRichiamo.png");
					reportParams.put("idMotivo", motivazioneRichiamoBean.getIdMotivazione());
					reportParams.put("altroMotivo", motivazioneRichiamoBean.getAltraMotivazione());
					reportParams.put("luogo", motivazioneRichiamoBean.getLuogo());
					reportParams.put("data", sdf.format(motivazioneRichiamoBean.getData()));
					reportParams.put("pDataValuta", sdf.format(disposizione.getDataValutaDestinatario()));
				
					
					List<DisposizioniBonifici> disposizioni = new ArrayList<DisposizioniBonifici>();
					disposizioni.add(disposizione);
					
					if (disposizione.getIddistintaBanca()!=null && disposizione.getIddistintaBanca()>0){
						DistintaBanca distintaBanca = distintaBancaDAO.getByIdDistintaBanca(disposizione.getIddistintaBanca());
						reportParams.put("importoDistinta", distintaBanca.getImportoDisposizioni());
						reportParams.put("valutaDistinta", sdf.format(distintaBanca.getDataValutaDestinatario()));
					} else {
						reportParams.put("importoDistinta", "");
						reportParams.put("valutaDistinta", "");
					}
					
					
					reportParams.put("logo", appPath+"img/bnl-logo.png");
					reportParams.put("logoFindomestic", appPath+"img/findomestic-logo-stampe.jpg");
					JRDataSource dsDisposizioni = new JRBeanCollectionDataSource(disposizioni);
					JasperPrint jasperPrint = JasperFillManager.fillReport(appPath + "Reports/repRichiamo.jasper", reportParams, dsDisposizioni);
					JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
					
					response.setContentType("application/pdf");
					response.setHeader("Content-Disposition","attachment;filename=RichiestaRichiamo.pdf");
					ServletOutputStream out = response.getOutputStream();
				    out.flush();
				    out.close();
				} else {
					response.setStatus(404); // not found
				}			    							
			}
				
	}
	
	
	@RequestMapping(value="/generaRichiamo/{iddisinta}/{iddisposizione}")
	@ResponseBody
	private ResponseEntity<Object> generaRichiamo(HttpServletRequest request,  
				@PathVariable("iddisinta") int idDistinta, 
				@PathVariable("iddisposizione") int idDisposizione) {
	
		setRequest(request);
		AppVariables appVariables = (AppVariables) getSessionAttribute("appVariables");
		if(getUserData()==null)
			return new ResponseEntity<Object>(HttpStatus.UNAUTHORIZED);
		else {
			try {
				Integer res = disposizioniBonificiDAO.generaRichiamo(appVariables, idDistinta,idDisposizione);
				return new ResponseEntity<Object>(res, HttpStatus.OK);
			} catch (Exception ex) {
				Logger.getRootLogger().error(ex);
				ex.printStackTrace();
				return new ResponseEntity<Object>(ex.getLocalizedMessage(),HttpStatus.INTERNAL_SERVER_ERROR);
			}
		}
	}
	
	
}
