package com.ejie.ad74a.jms.service;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import com.ejie.ad74a.constantes.Constantes;
import com.ejie.ad74a.dao.BandejaPapel0Dao;
import com.ejie.ad74a.dao.DocumentoPapel0Dao;
import com.ejie.ad74a.jms.util.MessageParser;
import com.ejie.ad74a.model.BandejaPapel0;
import com.ejie.ad74a.model.DocumentoPapel0;
import com.ejie.ad74a.util.comun.UtilTokenXlnets;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.Constantes.EstadosBandejaPapel0;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.ws.client.documentum.X97DistributionWebServiceImpl;
import com.ejie.ad74a.ws.client.libroRegistro.model.ejgvDocument.DocumentType;
import com.ejie.ad74a.ws.client.libroRegistro.model.ejgvDocument.InputRegisterType;
import com.ejie.ad74a.ws.client.platea.model.notification.NotificationBody;

/**
 * Papel0JMSServiceImpl
 * 
 * @author Inetum
 */

@Service(value = "papel0JMSService")
public class Papel0JMSServiceImpl implements Papel0JMSService {

	private static final Logger logger = LoggerFactory.getLogger(Papel0JMSServiceImpl.class);

	private static final int TRANSACTION_TIMEOUT = 60;

	@Autowired
	BandejaPapel0Dao bandejaPapel0Dao;

	@Autowired
	DocumentoPapel0Dao documentoPapel0Dao;

	@Autowired
	X97DistributionWebServiceImpl x97DistributionWebServiceImpl;

	@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED, rollbackFor = Throwable.class, timeout = Papel0JMSServiceImpl.TRANSACTION_TIMEOUT)
	public void proccesPapel0(NotificationBody notificationBody, Map<String, Object> mapaMensaje, String message)
			throws Throwable {
		Papel0JMSServiceImpl.logger.info("Papel0JMSServiceImpl.proccesRequest - Inicio");
		// leemos el Platea Type

		MessageParser<InputRegisterType> parserInputRegister = new MessageParser<InputRegisterType>(
				InputRegisterType.class.getPackage().getName());
		InputRegisterType input = parserInputRegister.parse(notificationBody.getXmlValue().get(0));
		input.getDocuments().getDocumentOid();
		BandejaPapel0 bandejaPapel0 = new BandejaPapel0();

		// Lista de oids
		bandejaPapel0.setListaOid(input.getDocuments().getDocumentOid());

		String jmsIdID = (String) mapaMensaje.get("jmsid");
		if (jmsIdID == null) {
			jmsIdID = " ";
		}
		bandejaPapel0.setIdjms12(jmsIdID);

		// Clob clobMsg = new javax.sql.rowset.serial.SerialClob(message.toCharArray());
		// bandejaPapel0.setMensaje12(clobMsg);

		// QR
		bandejaPapel0.setQrcode12(input.getQRCode());
		bandejaPapel0.setTipo12(TipoAportacionEnum.SOLICITUD.getTipo());
		String[] qrElements = input.getQRCode().split("#");
		if (qrElements.length == 3 && TipoAportacionEnum.APORTACION_DOCUMENTOS.getTipoLeadingZero()
				.equals(qrElements[qrElements.length - 1])) {
			// 00870#0X#02
			bandejaPapel0.setTipo12(TipoAportacionEnum.APORTACION_DOCUMENTOS.getTipo());
		} else if (qrElements.length == 3
				&& TipoAportacionEnum.SUBSANACION.getTipoLeadingZero().equals(qrElements[qrElements.length - 1])) {
			// 00870#0X#04;TL_2021_00132
			// TODO: revisar si el expediente vendrá en el QR o en el campo numExpediente
			// que s eme te en el Libro de Registro
			bandejaPapel0.setTipo12(TipoAportacionEnum.SUBSANACION.getTipo());
			String numExpediente = bandejaPapel0.getQrcode12().split(";")[1];
			bandejaPapel0.setNumExpediente12(numExpediente);

		} else if (qrElements.length == 3
				&& TipoAportacionEnum.DESISTIMIENTO.getTipoLeadingZero().equals(qrElements[qrElements.length - 1])) {
			// 00870#0X#06
			bandejaPapel0.setTipo12(TipoAportacionEnum.DESISTIMIENTO.getTipo());
			String numExpediente = bandejaPapel0.getQrcode12().split(";")[1];
			bandejaPapel0.setNumExpediente12(numExpediente);
		} else if (qrElements.length == 3 && TipoAportacionEnum.RECURSO_DESISTIMIENTO.getTipoLeadingZero()
				.equals(qrElements[qrElements.length - 1])) {
			// 00870#0X#05
			bandejaPapel0.setTipo12(TipoAportacionEnum.RECURSO_DESISTIMIENTO.getTipo());
			String numExpediente = bandejaPapel0.getQrcode12().split(";")[1];
			bandejaPapel0.setNumExpediente12(numExpediente);
		}

		bandejaPapel0.setNumRegistro12(input.getRegistryNumber());
		SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMddHHmmss");
		bandejaPapel0.setfRegistro12(formateador.parse(input.getRegistryDate()));

		bandejaPapel0.setNumRegOriginal12(input.getOriginalRegistryNumber());
		if (input.getOriginalRegistryDate() != null && !"".equals(input.getOriginalRegistryDate())) {
			bandejaPapel0.setfRegOriginal12(formateador.parse(input.getOriginalRegistryDate()));
		}

		if (input.getPersons().getPerson() != null && !input.getPersons().getPerson().isEmpty()) {
			bandejaPapel0.setRemitente12(input.getPersons().getPerson().get(0).getName());
		}
		// String n = null;
		// n.substring(1, 2);

		boolean existeMsgID = false;
		if (bandejaPapel0.getIdjms12() != null && !"".equals(bandejaPapel0.getIdjms12().trim())) {
			existeMsgID = this.bandejaPapel0Dao.existeMsgIDPapelCero(bandejaPapel0.getIdjms12());
		} else {
			existeMsgID = this.bandejaPapel0Dao.existeNumRegPapelCero(bandejaPapel0.getNumRegistro12());
		}

		if (!existeMsgID) {
			// Ponemos la fecha de insercion
			bandejaPapel0.setfLectura12(new Date());

			bandejaPapel0.setUsuAlta12(Constantes.COD_APLICACION);
			bandejaPapel0.setfAlta12(UtilidadesFecha.getFechaSistema());

			// Obtener el procedimiento
			if (ProcedimientosEnum.ALTA.getId().equalsIgnoreCase(bandejaPapel0.getIdProcedimiento())
					|| ProcedimientosEnum.BAJA.getId().equalsIgnoreCase(bandejaPapel0.getIdProcedimiento())
					|| ProcedimientosEnum.MODIFICACION.getId().equalsIgnoreCase(bandejaPapel0.getIdProcedimiento())
					|| ProcedimientosEnum.INFORME.getId().equalsIgnoreCase(bandejaPapel0.getIdProcedimiento())
					|| ProcedimientosEnum.REVISION_PRECIO.getId()
							.equalsIgnoreCase(bandejaPapel0.getIdProcedimiento())) {

				bandejaPapel0.setEstado12(EstadosBandejaPapel0.PENDIENTE);
				bandejaPapel0.setProcedureid12(bandejaPapel0.getIdProcedimiento());

				try {
					BandejaPapel0 newBandejaPapel0 = this.bandejaPapel0Dao.add(bandejaPapel0);

					DocumentoPapel0 docu = new DocumentoPapel0();
					docu.setBandejaPapel0(newBandejaPapel0);
					// Guardar los OIDs asociados a la entrada.
					ArrayList<DocumentType> oids = (ArrayList<DocumentType>) bandejaPapel0.getListaOid();

					Iterator<DocumentType> oidsIt = oids.iterator();

					while (oidsIt.hasNext()) {
						DocumentType oid = oidsIt.next();
						DocumentoPapel0 papelCeroOidDTO = new DocumentoPapel0();
						papelCeroOidDTO.setBandejaPapel0(newBandejaPapel0);
						papelCeroOidDTO.setOidDocumento13(oid.getId());
						papelCeroOidDTO.setExtension13(oid.getExt());
						this.documentoPapel0Dao.add(papelCeroOidDTO);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}

			} else {
				// Registrarla rechazada
				bandejaPapel0.setEstado12(EstadosBandejaPapel0.RECHAZADO);
				BandejaPapel0 newBandejaPapel0 = this.bandejaPapel0Dao.add(bandejaPapel0);

				// RECHAZAR EL ASIENTO REGISTRAL
				String tokenSesion = UtilTokenXlnets
						.getTokenStringXLNets(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
				StringBuilder info = new StringBuilder();
				info.append("<distribution><registryNumber>");
				info.append(newBandejaPapel0.getNumRegistro12());
				info.append("</registryNumber><cause>");
				info.append("No pertenece");
				info.append("</cause>");
				info.append("</distribution>");

				try {
					this.x97DistributionWebServiceImpl.rejectDistribution(tokenSesion, info.toString());
				} catch (Exception e) {
					Papel0JMSServiceImpl.logger.error("procesarPapelCero error", e);
				}

			}

		}

		Papel0JMSServiceImpl.logger.info("Papel0JMSServiceImpl.proccesRequest - Fin");
	}

}
