package com.mx.dla.dda.reporte.amortizacion.presupuesto.actions;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

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

import org.apache.ibatis.executor.result.ResultMapException;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;

import com.mx.dla.dda.contrato.common.actions.BaseContratoAction;
import com.mx.dla.dda.contrato.listado.dtos.ContentType;
import com.mx.dla.dda.contrato.transaccion.exceptions.dtos.TransaccionException;
import com.mx.dla.dda.excelMapper.exceptions.ExcelMapperException;
import com.mx.dla.dda.reporte.amortizacion.presupuesto.bo.ReporteAmortvsPptoBO;
import com.mx.dla.dda.reporte.amortizacion.presupuesto.dto.ReporteAmortizacionVsPresupuestoDTO;

public class ReporteAmortvsPptoAction extends BaseContratoAction {

	private static final long serialVersionUID = -6159275023094659946L;

	private String fecha;
	private List<ReporteAmortizacionVsPresupuestoDTO> reporteAmortPpto;
	private List<ReporteAmortizacionVsPresupuestoDTO> reporte;

	private InputStream fileInputStream;
	private String fileFileName;

	@Autowired
	private ReporteAmortvsPptoBO reporteAmortPptoBO;

	@Override
	public String execute() {

		return SUCCESS;
	}

	public String obtenerReporteAmortPpto() throws TransaccionException {

		try {
			logger.info("Inicia obtenReporteAmortPpto  - [{}]" + fecha);

			DateFormat formatoEntrada = new SimpleDateFormat("MM/yyyy");
			Date date = formatoEntrada.parse(fecha);

			SimpleDateFormat formatoMes = new SimpleDateFormat("MM");
			Long mes = Long.parseLong(formatoMes.format(date));

			SimpleDateFormat formatoAnio = new SimpleDateFormat("yyyy");
			Long annio = Long.parseLong(formatoAnio.format(date));

			reporteAmortPpto = reporteAmortPptoBO.obtenReporteAmortPpto(mes, annio);

			logger.info("Se consulta a DAO  - [{}]" + mes + "-" + annio);

		} catch (ResultMapException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (TransaccionException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (ParseException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		}

		return SUCCESS;
	}

	public String descargaReporte() throws TransaccionException {
		String nombre = "reporteAmortizacion.xlsx";
		try {
			byte[] bytes = reporteAmortPptoBO.descargaArchivoReporte(fecha);
			fileInputStream = new ByteArrayInputStream(bytes);
			fileFileName = nombre;
		} catch (ResultMapException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (TransaccionException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (ExcelMapperException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (IOException e) {
			logger.error("Error. {}", e);
			throw new TransaccionException("Ocurrio un error", e);
		}
		return SUCCESS;
	}

	public String descargaObjArchivo() throws TransaccionException {
		String nombre;
		byte[] rep;

		try {

			rep = reporteAmortPptoBO.descargaObjReporte(reporte);

			logger.info("reporte..." + reporte);

			nombre = "reporteAmortizacion";

			HttpServletResponse response = ServletActionContext.getResponse();
			response.setContentLength(rep.length);
			response.setContentType(ContentType.EXCELX.name());
			response.setHeader("Content-Disposition", "attachment;filename=" + nombre + ".xlsx");

			ServletOutputStream out = response.getOutputStream();
			out.write(rep);
			out.flush();
			out.close();

		} catch (ResultMapException e) {
			logger.error("ERROR - reporte amortizacion : [{}]", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (TransaccionException e) {
			logger.error("ERROR - reporte amortizacion : [{}]", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (IOException e) {
			logger.error("ERROR - reporte amortizacion : [{}]", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (ExcelMapperException e) {
			logger.error("ERROR - reporte amortizacion : [{}]", e);
			throw new TransaccionException("Ocurrio un error", e);
		}

		return SUCCESS;

	}

	public String getFecha() {
		return fecha;
	}

	public void setFecha(String fecha) {
		this.fecha = fecha;
	}

	public List<ReporteAmortizacionVsPresupuestoDTO> getReporteAmortPpto() {
		return reporteAmortPpto;
	}

	public List<ReporteAmortizacionVsPresupuestoDTO> getReporte() {
		return reporte;
	}

	public void setReporte(List<ReporteAmortizacionVsPresupuestoDTO> reporte) {
		this.reporte = reporte;
	}

	public void setReporteAmortPpto(List<ReporteAmortizacionVsPresupuestoDTO> reporteAmortPpto) {
		this.reporteAmortPpto = reporteAmortPpto;
	}

	public void setFileInputStream(InputStream fileInputStream) {
		this.fileInputStream = fileInputStream;
	}

	public void setFileFileName(String fileFileName) {
		this.fileFileName = fileFileName;
	}

	public String getFileFileName() {
		return fileFileName;
	}

	public InputStream getFileInputStream() {
		return fileInputStream;
	}

}
