package com.mx.dla.dda.contrato.listado.actions;

import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.executor.result.ResultMapException;
import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.JsonParseException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;

import com.mx.dla.dda.catalogos.bos.CatalogosBO;
import com.mx.dla.dda.contrato.listado.bos.ListadoContratoBO;
import com.mx.dla.dda.contrato.listado.dtos.CatListadoContratoDTO;
import com.mx.dla.dda.contrato.listado.dtos.ContratoListaDTO;
import com.mx.dla.dda.contrato.listado.dtos.RequestListadoDTO;
import com.mx.dla.dda.contrato.transaccion.exceptions.dtos.TransaccionException;
import com.mx.dla.global.actions.BaseAction;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

public class ListadoAction extends BaseAction {

	private static final long serialVersionUID = 1L;

	private CatListadoContratoDTO catalogos = new CatListadoContratoDTO();
	private List<ContratoListaDTO> listado = new ArrayList<>();
	private String request;
	private String msgError;
	private String msgExito;
	private HttpServletRequest httpRequest;

	private static final String ID_CONTRATO = "idContrato";
	private static final String ID_MOVIMIENTO = "idMovimiento";
	private static final String TIPO_CONTRATO = "tipoContrato";
	private static final String ERROR_MESSAGE_1 = "Ocurrió un error al obtener los datos.";
	private static final String ERROR_MESSAGE_2 = "Ocurrió un error al realizar la operación.";

	@Autowired
	private ListadoContratoBO listadoContratoBO;

	@Autowired
	private CatalogosBO catalogosBO;

	public String execute() {
		RequestListadoDTO requestListadoDTO = null;
		ObjectMapper mapper = new ObjectMapper();

		try {

			logger.info("Inicia obtencion listado. " + request);
			requestListadoDTO = mapper.readValue(request, RequestListadoDTO.class);
			listado = listadoContratoBO.getListadoContratos(requestListadoDTO);
			logger.info("Fin obtencion listado");

		} catch (JsonParseException | JsonGenerationException | JsonMappingException je) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", je);
		} catch (IOException ioe) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", ioe);
		} catch (ResultMapException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		} catch (ParseException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		}
		return Action.SUCCESS;
	}

	public String obtenerDocumentosCto() {
		RequestListadoDTO requestListadoDTO = null;
		ObjectMapper mapper = new ObjectMapper();

		try {

			requestListadoDTO = mapper.readValue(request, RequestListadoDTO.class);
			listado = listadoContratoBO.getDocumentos(requestListadoDTO.getIdContrato());

		} catch (JsonParseException | JsonGenerationException | JsonMappingException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		} catch (IOException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		} catch (PersistenceException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		}
		return Action.SUCCESS;
	}

	// jun-17 crea enmienda o adendum para cualqueir seccion...
	public String agregarEnmOAden() {

		try {

			Integer operacion = Integer.parseInt(httpRequest.getParameter(ID_MOVIMIENTO));

			this.getSession().put("pmn", httpRequest.getParameter("pmn"));
			this.getSession().put(TIPO_CONTRATO, Long.parseLong(httpRequest.getParameter(TIPO_CONTRATO)));

			if (operacion.intValue() == 1) {
				ActionContext.getContext().getSession().put(ID_CONTRATO, null);
				msgExito = "OK";
			} else if (operacion.intValue() == 2) {
				createAdemum();
			} else if (operacion.intValue() == 3 || operacion.intValue() == 4) {
				HashMap<String, Object> params = new HashMap<>();
				params.put(TIPO_CONTRATO, Integer.parseInt(httpRequest.getParameter(TIPO_CONTRATO)));
				params.put(ID_MOVIMIENTO, httpRequest.getParameter(ID_MOVIMIENTO));
				params.put(ID_CONTRATO, Long.parseLong(httpRequest.getParameter(ID_CONTRATO)));

				Long idNuevo = listadoContratoBO.crearEmnienda(params);
				this.getSession().put(ID_CONTRATO, idNuevo);

				msgExito = String.valueOf(idNuevo);
				logger.info("Enmienda generado con el id:" + (Long) this.getSession().get(ID_CONTRATO));
			} else if (operacion.intValue() == 5) {
				createAdemum();
			}

		} catch (PersistenceException e) {
			this.msgError = ERROR_MESSAGE_2;
			logger.error("Error.", e);
			return Action.ERROR;
		}
		return Action.SUCCESS;
	}

	private void createAdemum() {
		HashMap<String, Object> params = new HashMap<>();
		params.put(ID_CONTRATO, Long.parseLong(httpRequest.getParameter(ID_CONTRATO)));
		params.put(ID_MOVIMIENTO, httpRequest.getParameter(ID_MOVIMIENTO));
		Long idNuevo = listadoContratoBO.crearAdendum(params);
		this.getSession().put(ID_CONTRATO, idNuevo);

		msgExito = String.valueOf(idNuevo);
		logger.info("Adendum generado con el id:" + (Long) this.getSession().get(ID_CONTRATO));
	}

	public String verContrato() {

		try {
			this.getSession().put("pmn", httpRequest.getParameter("pmn"));
			this.getSession().put(TIPO_CONTRATO, Long.parseLong(httpRequest.getParameter(TIPO_CONTRATO)));
			this.getSession().put(ID_CONTRATO, Long.parseLong(httpRequest.getParameter(ID_CONTRATO)));
			this.getSession().put("numContrato", httpRequest.getParameter("numContrato"));
			this.getSession().put("estudio", httpRequest.getParameter("estudio"));
			logger.info("Se redirecciona hacia el contrato:" + this.getSession().get(ID_CONTRATO));
		} catch (PersistenceException e) {
			this.msgError = ERROR_MESSAGE_2;
			logger.error("Error.", e);
			return Action.ERROR;
		}

		return Action.SUCCESS;
	}

	public String getCatalogosAction() {

		try {

			catalogos.setEstudios(catalogosBO.obtenListaEstudios());

		} catch (PersistenceException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		} catch (SQLException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		} catch (TransaccionException e) {
			this.msgError = ERROR_MESSAGE_1;
			logger.error("Error.", e);
		}
		return Action.SUCCESS;
	}

	public List<ContratoListaDTO> getListado() {
		return listado;
	}

	public void setListado(List<ContratoListaDTO> listado) {
		this.listado = listado;
	}

	public String getRequest() {
		return request;
	}

	public void setRequest(String request) {
		this.request = request;
	}

	public void setMsgError(String msgError) {
		this.msgError = msgError;
	}

	public String getMsgError() {
		return msgError;
	}

	public CatListadoContratoDTO getCatalogos() {
		return this.catalogos;
	}

	public void setCatalogos(CatListadoContratoDTO catalogos) {
		this.catalogos = catalogos;
	}

	public String getMsgExito() {
		return msgExito;
	}

	@Override
	public void setServletRequest(HttpServletRequest request) {
		this.httpRequest = request;
	}

}
