package com.fitbank.report;

import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRExporter;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.util.JRLoader;

import com.fitbank.common.BeanManager;
import com.fitbank.common.exception.FitbankException;
import com.fitbank.web.HBParam;

public class ReportManager extends Thread{
	 private InputStream reportData;
	 private OutputStream output;
	 private ReportTypes type;
	 private Map<String,Object> parameterValues;

	 public ReportManager(InputStream pReport,OutputStream pOutput,ReportTypes pType){
		 this.reportData=pReport;
		 output=pOutput;
		 type=pType;
		 parameterValues=new HashMap<String, Object>();
	 }
	 public void putParameter(String pName, Object pValue){
		 this.parameterValues.put(pName, pValue);
	 }
	 public String getContentType() throws Exception{
		 return type.getContentType();
	 }
	 public void evalReport() throws Exception{
	  	JRExporter exporter = type.getExporter();
			JasperReport report=(JasperReport)JRLoader.loadObject(reportData);
			this.validateReportParameters(report);
//			JRDataSource ds=new JRXmlDataSource(JRXmlUtils.parse(new InputSource(new java.io.StringReader(detail.toErrorXml()))));
     //JRProperties.setProperty("net.sf.jasperreports.query.executer.factory.xpath2", "net.sf.jasperreports.engine.query.JRXPathQueryExecuterFactory");

     
			JasperPrint impresor = JasperFillManager.fillReport(report, parameterValues);//, ds);
			
			exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, output);
			exporter.setParameter(JRExporterParameter.JASPER_PRINT, impresor);
			exporter.exportReport();
	  }
	 
	  private void validateReportParameters(JasperReport pReport) throws Exception{
	  	 if(!this.parameterValues.containsKey("FITBANK_HEADER_LOGO")){
	  		 this.parameterValues.put("FITBANK_HEADER_LOGO", HBParam.getInstance().getStringValue("report.header.logo"));
	  	 }
	     JRParameter[]parameters= pReport.getParameters();
	     for (JRParameter parameter : parameters) {
				if(!parameter.isSystemDefined()){
					if(!this.parameterValues.containsKey(parameter.getName())){
						throw new FitbankException("REP004","EL PARAMETRO ({0}){1} NO TIENE VALOR", parameter.getName(),parameter.getDescription());
					}else{
						  Object value=this.parameterValues.get(parameter.getName());
						  if(value.getClass().getSimpleName().compareTo(parameter.getValueClass().getSimpleName())!=0){
						  	value=BeanManager.convertObject(value, parameter.getValueClass());
						  	this.parameterValues.put(parameter.getName(), value);
						  }
					}
				}
			}
	  }

}
