package com.mx.dla.dda.admin.catalogos.apartados.actions;

import java.io.IOException;
import java.net.SocketTimeoutException;
import java.sql.SQLException;
import java.util.List;

import org.apache.ibatis.exceptions.PersistenceException;
import org.apache.ibatis.executor.result.ResultMapException;
import org.springframework.beans.factory.annotation.Autowired;

import com.mx.dla.dda.admin.catalogos.apartados.bos.ApartadosBO;
import com.mx.dla.dda.contrato.common.actions.BaseContratoAction;
import com.mx.dla.dda.contrato.excepcion.SuscriptorException;
import com.mx.dla.dda.contrato.generales.dtos.ApartadoDTO;
import com.mx.dla.dda.contrato.transaccion.exceptions.dtos.TransaccionException;

public class ApartadosAction extends BaseContratoAction {

	private static final long serialVersionUID = 6539076129813362003L;

	private List<ApartadoDTO> apartados;
	private String descripcion;
	private String idApartado;
	private String amortizable;
	private String mensaje;

	@Autowired
	private ApartadosBO apartadosBO;

	public String CatalogoApartados() {
		try {

			this.apartados = apartadosBO.selectBusquedaApartados(amortizable);

		} catch (ResultMapException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (PersistenceException ibe) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", ibe);
		} catch (TransaccionException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (SQLException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		}
		return "listado";
	}

	public String generarApartado() {

		try {
			logger.debug("" + this.descripcion + ":" + this.idApartado + ":" + this.amortizable);
			this.mensaje = apartadosBO.generarApartado(this.descripcion, this.idApartado, this.amortizable);
			if (this.mensaje != null)
				this.idApartado = this.mensaje;

		} catch (SuscriptorException se) {
			this.mensaje = se.getMessage();
			this.idApartado = null;
		} catch (ResultMapException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (PersistenceException ibe) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", ibe);
		} catch (TransaccionException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (SQLException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (SocketTimeoutException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (IOException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		}
		return "listado";
	}

	public String notificarSAP() {

		try {
			logger.debug("" + this.descripcion + ":" + this.idApartado + ":" + this.amortizable);

			ApartadoDTO apartado = new ApartadoDTO(Long.parseLong(this.idApartado), this.descripcion);

			logger.debug(apartado.toString());
			apartadosBO.notificarApartadoNoAmortizablesSAP(apartado);

			this.idApartado = apartado.getIdSap() != null || apartado.getIdSap().compareTo("") != 0
					? apartado.getIdSap()
					: null;
			this.mensaje = "OK";

		} catch (ResultMapException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (PersistenceException ibe) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", ibe);
		} catch (TransaccionException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (SQLException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (SocketTimeoutException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		} catch (IOException e) {
			this.mensaje = "Ocurrió un error.";
			logger.error("Ocurrió un error al obtener los datos.", e);
		}
		return "listado";
	}

	public List<ApartadoDTO> getApartados() {
		return apartados;
	}

	public String getMensaje() {
		return mensaje;
	}

	public void setDescripcion(String descripcion) {
		this.descripcion = descripcion;
	}

	public void setIdApartado(String idApartado) {
		this.idApartado = idApartado;
	}

	public String getIdApartado() {
		return idApartado;
	}

	public void setAmortizable(String amortizable) {
		this.amortizable = amortizable;
	}
}
