package com.mx.dla.dda.contrato.transaccion.terminos.actions;

import java.io.File;
import java.util.List;

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

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.generales.bos.GeneralesBO;
import com.mx.dla.dda.contrato.generales.dtos.ContratoDTO;
import com.mx.dla.dda.contrato.listado.dtos.ContentType;
import com.mx.dla.dda.contrato.transaccion.exceptions.dtos.TransaccionException;
import com.mx.dla.dda.contrato.transaccion.terminos.bos.TerminosTransaccionBO;
import com.mx.dla.dda.contrato.transaccion.terminos.dtos.ComunTerminosDTO;
import com.mx.dla.global.dtos.FilaExcelDTO;

public class TerminosTransaccionAction extends BaseContratoAction {

	private static final long serialVersionUID = 1L;
	
	private String  msgError;
	private String  msgExito;
	private String  fileContentType;
	private String  fileFileName;
	private String  tipoFees;
	private String  operacion;
	private File    file;
	private Long    idCto;
	private ComunTerminosDTO comun;	
    private List<List<String>>   datos;
    private List<String>         encabezados;
    private List<FilaExcelDTO>   datosMatriz;
    private ContratoDTO contrato;
  	
	@Autowired
	private TerminosTransaccionBO terminos;
	
	@Autowired
	private GeneralesBO generales;
		
	public String obtenerTerminos(){
		try 
		{
			Long idContrato = (Long)this.getSession().get("idContrato");
			comun = terminos.obtenerDatosComun(idContrato);
			contrato=generales.obtenContrato(idContrato);
			logger.info("{}", contrato);

			
		} catch (TransaccionException e) {
			msgError = "Ocurrio eun Erro al obtener los terminos.";
		}
		return SUCCESS;
	}
	
	public String cargaArchivo() {
		try
		{															
			UsuarioDTO usuario = (UsuarioDTO) getSession().get("usuario");	
			
			this.datosMatriz   = terminos.obtenerDatosExcel(file, fileFileName, usuario.getExpediente(), (Long)this.getSession().get("idContrato"));												
				
		}catch(Exception e)
		{
			logger.error("Error {}",e);			
			this.msgError = "Ocurrió un error al cargar los datos.";
		}
		return SUCCESS;
	}	
	
	
	public String descargar() {

		String nombre = null;
		byte[] result = null;
		try
		{									    							
			result = terminos.descargarArchivoExcel(tipoFees, operacion, this.datos, this.encabezados);
			nombre = terminos.getNombreArchivo() + this.idCto;
				
			HttpServletResponse response = ServletActionContext.getResponse();
			response.setContentLength(result.length);
			response.setContentType(ContentType.EXCELX.name());
		    response.setHeader("Content-Disposition","attachment;filename="+nombre+".xlsx");		    
				    
			ServletOutputStream out = response.getOutputStream();
			out.write(result);
			out.flush();																
		}
		catch(Exception e){		
			logger.error("{}", e);
		}	
		return null;
	}
	
	public String getFileContentType()                 { return fileContentType; }
	public String getFileFileName()                    { return fileFileName; }
	public File getFile()                              { return file; }		
	public String getMsgError()                        { return msgError; }
	public String getMsgExito()                        { return msgExito; }
	public String getTipoFees()                        { return tipoFees; }
	public List<FilaExcelDTO> getDatosMatriz()         { return datosMatriz; }
	public ComunTerminosDTO getComun()                 { return comun; }
	public String getOperacion()                       { return operacion; }
	
	public void setMsgError(String msgError)                 { this.msgError = msgError; }
	public void setMsgExito(String msgExito)                 { this.msgExito = msgExito; }
	public void setFile(File file)                           { this.file = file; }
	public void setTipoFees(String tipoFees)                 { this.tipoFees = tipoFees;}
	public void setOperacion(String operacion)               { this.operacion = operacion;}
	public void setIdCto(Long idCto)                         { this.idCto = idCto;}
	public void setDatos(List<List<String>> datos)           { this.datos = datos;}
	public void setEncabezados(List<String> encabezados)     { this.encabezados = encabezados; }

	public ContratoDTO getContrato() {
		return contrato;
	}

	public void setContrato(ContratoDTO contrato) {
		this.contrato = contrato;
	}	
	
}