package com.ejie.ad74a.service.tramitacion;

import java.rmi.UnmarshalException;
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.DocumentosMedicosDao;
import com.ejie.ad74a.dao.SolicitantesDao;
import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.BandejaEntradas;
import com.ejie.ad74a.model.DatosTareaEstudio;
import com.ejie.ad74a.model.DocumentosMedicos;
import com.ejie.ad74a.model.DocumentosTarea;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.TareasTramite;
import com.ejie.ad74a.model.TramitesExpediente;
import com.ejie.ad74a.service.BandejaEntradasService;
import com.ejie.ad74a.service.ExpedientesService;
import com.ejie.ad74a.service.TareasTramiteService;
import com.ejie.ad74a.service.TramitesExpedienteService;
import com.ejie.ad74a.util.comun.UtilidadesXML;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.FinalizacionEstudioEnum;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;

/**
 * Gestión de la Tarea de Entrada de Documentación - NO TAREA PLATEA
 * 
 * @author IBERMATICA
 */

@Service(value = "tareaEstudioDocumentacionService")
public class TareaEstudioDocumentacionServiceImpl implements TareaEstudioDocumentacionService {

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

	@Autowired
	private BandejaEntradasService bandejaEntradasService;

	@Autowired
	private TramitesExpedienteService tramitesExpedienteService;

	@Autowired
	private ExpedientesService expedientesService;

	@Autowired
	private SolicitantesDao solicitantesDao;

	@Autowired
	private TareasTramiteService tareasTramiteService;

	@Autowired
	private TramitacionService tramitacionService;

	@Autowired
	private DocumentosMedicosDao documentosMedicosDao;

	@Override
	public void tratarTareaEstudioDocumentacion(List<DocumentosTarea> listaDocumentosAportados, Long idExpediente,
			TareasTramite tareaUpdate, TramitesExpediente tramite, Boolean tramitar) {
		TareaEstudioDocumentacionServiceImpl.logger
				.debug(" INICIO TareaEstudioDocumentacionServiceImpl tratarTareaEstudioDocumentacion idExpediente: "
						+ idExpediente + " _ tramitar: " + tramitar);

		Expedientes exp = this.expedientesService.find(new Expedientes(idExpediente));

		if (Boolean.TRUE.equals(tramitar)) {
			this.validacionTramitarEstudio(idExpediente, tareaUpdate, tramite);
		}

		try {

			// actualizamos el tramite
			this.tramitesExpedienteService.update(tramite);
			// actualizamoss la tarea
			this.tareasTramiteService.update(tareaUpdate);

			if (tramitar) {

				/************************************
				 * IMPORTANTE
				 ************************************/

				// PREPARAR Y EJECUTAR TAREA
				this.tramitacionService.finalizarTareaEstudio(exp.getFolderId00(),
						tareaUpdate.getCodSituacion11() != null ? tareaUpdate.getCodSituacion11().toString() : null);

			}
		} catch (Throwable e) {
			ManagerErrors.manageException(e, "Error al guardar/ejecutar la tarea de estudio");
		}

		TareaEstudioDocumentacionServiceImpl.logger.debug(
				" FIN TareaEstudioDocumentacionServiceImpl tratarTareaEstudioDocumentacion tramitar: " + tramitar);
	}

	private void validacionTramitarEstudio(Long codExpediente, TareasTramite tarea, TramitesExpediente tramite) {

		Expedientes exp = this.expedientesService.find(new Expedientes(codExpediente));

		DatosTareaEstudio datosTareaEstudio = null;
		try {
			datosTareaEstudio = (DatosTareaEstudio) UtilidadesXML.unmarshallerObject(tarea.getDatosTareaStr(),
					DatosTareaEstudio.class);
		} catch (UnmarshalException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		if (ProcedimientosEnum.ALTA.getId().equals(exp.getIdProcedimiento00()) && datosTareaEstudio != null
				&& FinalizacionEstudioEnum.RESOLUCION_CONCESION.getId()
						.equals(datosTareaEstudio.getSituacioneFinalTarea().toString())) {

			if (Boolean.TRUE.equals(this.solicitantesDao.isSolAlta(exp.getSolicitantes()))) {
				ManagerErrors.manageError("error.tramitar.estudio.doc.solicitante.alta");
			}

			// Hay que comprobar que existe informe medico en las resoluciones de alta;

			DocumentosMedicos docMedFilter = new DocumentosMedicos(exp.getIdExpediente00());
			List<DocumentosMedicos> docMedList = this.documentosMedicosDao.findAllLike(docMedFilter, null);

			if (docMedList.isEmpty()) {
				ManagerErrors.manageError("error.tramitar.estudio.doc.sinInformeSocial");

			}

		}

		if (ProcedimientosEnum.BAJA.getId().equals(exp.getIdProcedimiento00())
				&& FinalizacionEstudioEnum.RESOLUCION_CONCESION.getId()
						.equals(datosTareaEstudio.getSituacioneFinalTarea().toString())) {
			Boolean isSolAlta = this.solicitantesDao.isSolAlta(exp.getSolicitantes());

			if (Boolean.FALSE.equals(isSolAlta) && ProcedimientosEnum.BAJA.getId().equals(exp.getIdProcedimiento00())) {
				ManagerErrors.manageError("error.tramitar.estudio.doc.solicitante.noAlta");
			}
		}

		if ((ProcedimientosEnum.ALTA.getId().equals(exp.getIdProcedimiento00()) && datosTareaEstudio != null
				&& FinalizacionEstudioEnum.RESOLUCION_CONCESION.getId()
						.equals(datosTareaEstudio.getSituacioneFinalTarea().toString()))
				|| (ProcedimientosEnum.MODIFICACION.getId().equals(exp.getIdProcedimiento00())
						&& datosTareaEstudio != null && FinalizacionEstudioEnum.RESOLUCION_CONCESION.getId()
								.equals(datosTareaEstudio.getSituacioneFinalTarea().toString()))) {
			// Hay que asegurar que han marcado el radio de piso tutelado
			if (exp.getPerfiles().getPisoTutelado07() == null) {
				ManagerErrors.manageError("error.tramitar.estudio.doc.solicitante.pisoTutelado");
			}
		}

		List<BandejaEntradas> listBandejas = this.bandejaEntradasService.getEntradasExpediente(codExpediente,
				Constantes.EstadosBandejaPapel0.PENDIENTE);
		if (null != listBandejas && !listBandejas.isEmpty() && listBandejas.size() > 0) {
			ManagerErrors.manageError("error.tramitar.estudio.doc.bandeja.pendiente");
		}
		// El trámite de Estudio de documentacion por apertura esta creado y no
		// finalizado
		if (null != tramite.getfRealizacion10()) {
			ManagerErrors.manageError("error.tramitar.estudio.doc.tramite.cerrado");
		}
		// La tarea de Estudio de documentacion por apertura esta sugerida
		if (null != tarea
				&& tarea.getIdEstado11().equalsIgnoreCase(Constantes.EstadoTramitacion.ESTADO_TAREA_FINALIZADA)) {
			ManagerErrors.manageError("error.tramitar.estudio.doc.tarea.cerrado");
		}

		if (null != tarea.getDatosTareaEstudio() && null == tarea.getDatosTareaEstudio().getSituacioneFinalTarea()) {
			ManagerErrors.manageError("error.tareaEstudio.situacion.obligatorio");
		}

		if (null != tarea.getDatosTareaEstudio() && null == tarea.getDatosTareaEstudio().getResultadoEstudio()) {
			ManagerErrors.manageError("error.tareaEstudio.estadoDoc.obligatorio");
		}

		//

	}

}
