package com.ejie.ad74a.jms.service;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ejie.ad74a.dao.MaestroTiposDocDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.BandejaPapel0;
import com.ejie.ad74a.model.BandejaTelematica;
import com.ejie.ad74a.model.DocumentoPapel0;
import com.ejie.ad74a.model.DocumentosBanTel;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.Informes;
import com.ejie.ad74a.model.MaestroTiposDoc;
import com.ejie.ad74a.service.InformesService;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.TipoAportacionEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoExpedientes;
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.context.ContextSubmissionEvent;
import com.ejie.ad74a.ws.client.platea.model.context.DocumentEvent;
import com.ejie.ad74a.ws.client.platea.model.context.DocumentsEvent;

@Service(value = "parserJMSRequest")
public class ParserJMSRequest {
	private static final Logger logger = LoggerFactory.getLogger(ParserJMSRequest.class);

	@Autowired
	private MaestroTiposDocDao maestroTiposDocDao;

	@Autowired
	private InformesService informesService;

	/**
	 * Constructor de UtilString
	 */
	private ParserJMSRequest() {
	}

	public BandejaTelematica getBandejaTelematicaEjgv(ContextSubmissionEvent contextSubmissionEvent) {

		String regNumber = contextSubmissionEvent.getRegistryNumber();
		String regDate = contextSubmissionEvent.getRegistryTimestamp();

		BandejaTelematica bandeja = new BandejaTelematica();
		bandeja.setIdjms14(contextSubmissionEvent.getSolicitudID());
		bandeja.setNumRegistro14(regNumber);

		try {
			if (null != regDate && regDate.contains("-")) {
				bandeja.setfRegistro14(UtilidadesFecha.formatearStringToDateFormato(regDate,
						com.ejie.ad74a.constantes.Constantes.PLATEA_XML_EVENTS_DATE_FORMAT));
			} else if (null != regDate && regDate.contains("/")) {
				bandeja.setfRegistro14(UtilidadesFecha.formatearStringToDateFormato(regDate,
						com.ejie.ad74a.constantes.Constantes.TIMESTAMP_MASK_DEFAULT));
			}
		} catch (ParseException e) {
			logger.error("Error al parsear la fecha de registro");
		}

		bandeja.setSubmisiontype14(contextSubmissionEvent.getSubmissionType());
		bandeja.setProcedureid14(contextSubmissionEvent.getProcedureID());
		bandeja.setFolderid14(contextSubmissionEvent.getFolderID());
		bandeja.setSenderName14(contextSubmissionEvent.getSenderName());
		bandeja.setSenderId14(contextSubmissionEvent.getSenderID());

		try {
			if (!Utilidades.esBlancoNulo(contextSubmissionEvent.getInstanceId())) {
				bandeja.setInstanceid14(new Long(contextSubmissionEvent.getInstanceId()));
			}
		} catch (Exception e) {
			logger.error("Error al recuperar el instanceId");
		}

		String submissionType = contextSubmissionEvent.getSubmissionType();
		bandeja.setSubmisiontype14(submissionType);

		bandeja.setEstado14(Constantes.EstadosBandejaTelematica.PENDIENTE);
		bandeja.setUsuAlta14(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);

		// recuperamos los documentos aportados
		DocumentsEvent listaDocumentos = contextSubmissionEvent.getDocumentsEvent();
		// si tiene documento de urgencia, la entrada es urgente
		for (DocumentEvent docEvent : listaDocumentos.getDocumentEvent()) {
			if (docEvent.getRoleId().equalsIgnoreCase(Constantes.RolesIDDocumentos.DOC_URGENCIA)) {
				if (!Utilidades.esBlancoNulo(docEvent.getOid())) {
					bandeja.setUrgencia14(TipoExpedientes.urgencia00.SI.getId());
				}
				break;
			}
		}

		return bandeja;
	}

	public DocumentosBanTel getDocumentoBandejaFromDocumentEvent(DocumentEvent document,
			BandejaTelematica bandejaTelematica) {

		DocumentosBanTel documEntrada = null;

		// hay que recuperar por roleId su relacion con la tabla de tipos de
		// documento
		MaestroTiposDoc tiposDoc = new MaestroTiposDoc();
		tiposDoc.setRoleid36(document.getRoleId());
		List<MaestroTiposDoc> listaTipos = this.maestroTiposDocDao.findAll(tiposDoc, null);

		if (null != listaTipos && listaTipos.size() > 0) {
			documEntrada = new DocumentosBanTel();
			documEntrada.setIdTipodoc15(listaTipos.get(0).getIdTipoDoc36());
			documEntrada.setIdTipodocReal15(listaTipos.get(0).getIdTipoDoc36());
			documEntrada.setOiddokusi15(document.getOid());
			documEntrada.setRoleid15(document.getRoleId());
			documEntrada.setRoleNameEs15(document.getRoleNameEs());
			documEntrada.setRoleNameEu15(document.getRoleNameEu());
			documEntrada.setNombreDoc15(document.getSourceName());
			documEntrada.setUsuAlta15(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
			documEntrada.setTipoAdjunto15(document.getDocumentType());

			if (!Utilidades.esBlancoNulo(document.getFechaEntregado())) {
				documEntrada.setFEntrega15(UtilidadesFecha.parsearFechaPlatea(document.getFechaEntregado()));
				documEntrada.setDepEntrega15(document.getOrganoEntregado());
				if (!Utilidades.esBlancoNulo(document.getDocumentoEntregado())) {
					documEntrada.setNombreDoc15(document.getDocumentoEntregado());
				}
			} else if (!Utilidades.esNulo(bandejaTelematica.getfRegistro14())) {
				documEntrada.setFEntrega15(bandejaTelematica.getfRegistro14());
			}
			documEntrada.setBandejaTelematica(bandejaTelematica);
		} else {
			ManagerErrors.manageError("Hay documentos no tipificados roleID: " + document.getRoleId());
		}

		return documEntrada;
	}

	public BandejaPapel0 getBandejaPapelo0(InputRegisterType inputRegister) {

		/**
		 * ID_ENTRADA_12 F_LECTURA_12 IDJMS_12 NUM_REGISTRO_12 F_REGISTRO_12 QRCODE_12
		 * MENSAJE_12 ESTADO_12 BLOQUEO_12 TIPO_12 REMITENTE_12 NUM_REG_ORIGINAL_12
		 * F_REG_ORIGINAL_12 USU_RESPONSABLE_12 NUM_EXPEDIENTE_12 PROCEDUREID_12
		 */

		BandejaPapel0 bandeja = new BandejaPapel0();
		bandeja.setfLectura12(UtilidadesFecha.getFechaSistema());
		bandeja.setNumRegistro12(inputRegister.getRegistryNumber());
		SimpleDateFormat formateador = new SimpleDateFormat("yyyyMMddHHmmss");
		try {
			bandeja.setfRegistro12(formateador.parse(inputRegister.getRegistryDate()));
		} catch (Exception e) {
		}
		bandeja.setQrcode12(inputRegister.getQRCode());
		// TODO MENSAJE_12 ¿?¿?
		bandeja.setEstado12(Constantes.EstadosBandejaPapel0.PENDIENTE);
		// TIPO -> viene en el QRCode 00870#02#02 es el ultimo campo e indica el tipo de
		// accion telematica
		bandeja.setTipo12(getTelematicAction(inputRegister.getQRCode()));

		bandeja.setRemitente12("");
		if (inputRegister.getPersons().getPerson() != null && !inputRegister.getPersons().getPerson().isEmpty()) {
			bandeja.setRemitente12(inputRegister.getPersons().getPerson().get(0).getName());
		}

		// Buscamos si existe informe social para obtener la urgencia. Solo para las
		// solicitudes
		if (bandeja.getTipo12() != null
				&& Integer.valueOf(TipoAportacionEnum.SOLICITUD.getTipo()).equals(Integer.valueOf(bandeja.getTipo12()))
				&& !Utilidades.esBlancoNulo(bandeja.getRemitente12())) {
			String[] remitente = bandeja.getRemitente12().split("-");
			if (null != remitente && remitente.length > 1) {
				Informes informe = this.informesService.getInformeSocialSinMatchByNIF(remitente[1].trim(), true);
				if (!Utilidades.esNulo(informe) && !Utilidades.esNulo(informe.getInformeSocial())) {
					bandeja.setUrgencia12(informe.getUrgente16());
				}
			}
		}

		bandeja.setNumRegOriginal12(inputRegister.getOriginalRegistryNumber());
		try {
			bandeja.setfRegOriginal12(formateador.parse(inputRegister.getOriginalRegistryDate()));
		} catch (Exception e) {
		}
		bandeja.setNumExpediente12(getNumExpediente(inputRegister.getQRCode()));
		bandeja.setProcedureid12(getApplicationType(inputRegister.getQRCode()));
		// TODO: mirar el límte de este campo al insertarlo desde el libro de registro
		bandeja.setResumen12(inputRegister.getResumen() != null && inputRegister.getResumen().length() > 500
				? inputRegister.getResumen().substring(0, 500)
				: inputRegister.getResumen());
		bandeja.setIdjms12(inputRegister.getIdJms());

		bandeja.setUsuAlta12(com.ejie.ad74a.constantes.Constantes.COD_APLICACION);
		bandeja.setfAlta12(UtilidadesFecha.getFechaSistema());

		return bandeja;
	}

	public DocumentoPapel0 getDocumentoBandejaPapel0(DocumentType documento, BandejaPapel0 bandeja) {

		DocumentoPapel0 docPapel = new DocumentoPapel0();
		docPapel.setBandejaPapel0(bandeja);
		docPapel.setOidDocumento13(documento.getId());
		docPapel.setExtension13(documento.getExt());

		return docPapel;
	}

	private String getApplicationType(String qrCode) {
		// <QRCode>00458#0X</QRCode>
		String appType = "";
		try {
			String[] valores = qrCode.split("#");
			if (null != valores && valores.length > 1) {
//				appType = valores[1];
				appType = ProcedimientosEnum.getIdProcByIdLibroReg(valores[1]);
			} else {
				// ManagerErrors.manageError("el QR no tiene el tipo de procedimiento a
				// procesar");
			}

			return "".equals(appType) ? ProcedimientosEnum.ALTA.getId() : appType;
		} catch (Exception e) {
			return ProcedimientosEnum.ALTA.getId();
		}
	}

	private String getTelematicAction(String qrCode) {
		// <QRCode>00458#0X#0X</QRCode>
		// En caso de aportación llega <QRCode>00870#02#02;TL_2024_000246</QRCode>
		try {
			String telAction = "";
			if (qrCode.split(";").length > 1) {
				// Es una aportacion, quitamos la parte del numero del expediente
				qrCode = qrCode.split(";")[0];
			}
			String[] valores = qrCode.split("#");
			if (null != valores && valores.length > 2) {
				telAction = TipoAportacionEnum.getIdAporByIdLibroReg(valores[2]);
//				return valores[2];
			} else {
				// ManagerErrors.manageError("el QR no tiene la accion telematica a realizar");
			}
			return "".equals(telAction) ? TipoAportacionEnum.SOLICITUD.getTipoLeadingZero() : telAction;
		} catch (Exception e) {
			return TipoAportacionEnum.SOLICITUD.getTipoLeadingZero();
		}
	}

	/**
	 * Devuelve el numExpediente a partir del QR
	 * 
	 * Cuando es subsanación, vendrá el numExpediente después de un ';'
	 * 
	 * @param qrCode
	 * @return String
	 */
	private String getNumExpediente(String qrCode) {
		try {
			if (qrCode.indexOf(';') >= 0) {
				// 00870#0X#04;TL_2021_00132
				return qrCode.split(";")[1];
			}
		} catch (Exception e) {
		}

		return null;

	}

	public List<DocumentosTarea> parseDocEntradaToDocTarea(List<DocumentosBanTel> listaDocEntrada,
			Long idTareaTramite) {
		DocumentosTarea docTarea = null;
		List<DocumentosTarea> listaDocTarea = new ArrayList<DocumentosTarea>();
		MaestroTiposDoc tipoDoc = new MaestroTiposDoc();
		for (DocumentosBanTel docEntrada : listaDocEntrada) {
			docTarea = new DocumentosTarea();
			tipoDoc.setIdTipoDoc36(docEntrada.getIdTipodoc15());
			List<MaestroTiposDoc> listaTipos = this.maestroTiposDocDao.findAll(tipoDoc, null);
			docTarea.setMaestroTiposDoc(listaTipos.get(0));
			docTarea.setIdTareaTram18(idTareaTramite);
			docTarea.setNombreDoc18(docEntrada.getNombreDoc15());
			// docTarea.setObligatorio29(docEntrada.get);
			docTarea.setOiddokusi18(docEntrada.getOiddokusi15());
			docTarea.setTipoAdjunto18(docEntrada.getTipoAdjunto15());
			docTarea.setDepEntrega18(docEntrada.getDepEntrega15());
			docTarea.setfEntrega18(docEntrada.getFEntrega15());

			listaDocTarea.add(docTarea);
		}
		return listaDocTarea;
	}

}
