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

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

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

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

import com.mx.dla.admin.dtos.UsuarioDTO;
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.reporte.amortizacion.baseActivos.bos.BaseActivosBO;
import com.mx.dla.dda.reporte.ws.dtos.ResponseGeneraReporteDTO;

public class BaseActivosAction extends BaseContratoAction {

	private static final long serialVersionUID = 4698989047503278255L;

	private ResponseGeneraReporteDTO respuesta;

	private String mensajeExcepcion;
	private String fecha;
	private String fechaFin;
	private String rutaArchivo;
	private String contentType;

	@Autowired
	private BaseActivosBO baseActivosBO;

	public String primeraCarga() {
		return SUCCESS;
	}

	public String generarReporte() throws TransaccionException {
		try {
			DateFormat formatoEntrada = new SimpleDateFormat("yyyy");
			Date date = formatoEntrada.parse(fecha);
			Date dateFin = formatoEntrada.parse(fechaFin);

			SimpleDateFormat formatoAnio = new SimpleDateFormat("yyyy");
			Long anio = Long.parseLong(formatoAnio.format(date));
			Long anioFin = Long.parseLong(formatoAnio.format(dateFin));

			UsuarioDTO usuario = (UsuarioDTO) getSession().get("usuario");
			String fileFileName = "rba" + usuario.getExpediente() + "" + anio;

			respuesta = baseActivosBO.generaReporteBaseActivos(fileFileName, anio, anioFin);

		} 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 (IOException 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 descargarArchivo() throws TransaccionException {

		byte[] result = null;

		logger.info("ruta archivo: " + rutaArchivo);

		try {
			String[] layRuta = rutaArchivo.split("\\/");
			Long lnuTotalRuta = (long) layRuta.length;

			String nombre = layRuta[(int) (lnuTotalRuta - 1)];
			File file = new File(rutaArchivo);

			logger.info("nombre archivo: " + nombre);
			logger.info("descar: " + rutaArchivo);

			result = IOUtils.toByteArray(new FileInputStream(file));
			contentType = ContentType.getType(FilenameUtils.getExtension(rutaArchivo));

			HttpServletResponse response = ServletActionContext.getResponse();
			response.setContentLength(result.length);
			response.setContentType(this.contentType);
			response.setHeader("Content-Disposition", "attachment; filename=" + nombre);

			logger.info("response [{}] :" + response);

			ServletOutputStream out = response.getOutputStream();
			out.write(result);
			out.flush();

		} catch (ResultMapException e) {
			logger.error("Error en [" + this.getClass() + "]", e);
			throw new TransaccionException("Ocurrio un error", e);
		} catch (IOException e) {
			logger.error("Error en [" + this.getClass() + "]", e);
			throw new TransaccionException("Ocurrio un error", e);
		}

		return null;
	}

	public ResponseGeneraReporteDTO getRespuesta() {
		return respuesta;
	}

	public void setRespuesta(ResponseGeneraReporteDTO respuesta) {
		this.respuesta = respuesta;
	}

	public String getMensajeExcepcion() {
		return mensajeExcepcion;
	}

	public void setMensajeExcepcion(String mensajeExcepcion) {
		this.mensajeExcepcion = mensajeExcepcion;
	}

	public String getRutaArchivo() {
		return rutaArchivo;
	}

	public void setRutaArchivo(String rutaArchivo) {
		this.rutaArchivo = rutaArchivo;
	}

	public String getFecha() {
		return fecha;
	}

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

	public String getFechaFin() {
		return fechaFin;
	}

	public void setFechaFin(String fechaFin) {
		this.fechaFin = fechaFin;
	}

}
