package com.ejie.ad74a.ws.server.televida.service;

import java.math.BigInteger;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

import com.ejie.ad74a.dao.DispositivosDao;
import com.ejie.ad74a.dao.MaestroEmergenciasDao;
import com.ejie.ad74a.dao.MaestroIntervencionesDao;
import com.ejie.ad74a.dao.MaestroNivSoporteDao;
import com.ejie.ad74a.dao.MaestroSubtpoLlamadaDao;
import com.ejie.ad74a.dao.MaestroTipoAlarmaDao;
import com.ejie.ad74a.dao.MaestroTipoLlamadaDao;
import com.ejie.ad74a.dao.MotivosBajaDao;
import com.ejie.ad74a.dao.TerminalesDao;
import com.ejie.ad74a.model.Dispositivos;
import com.ejie.ad74a.model.MaestroEmergencias;
import com.ejie.ad74a.model.MaestroIntervenciones;
import com.ejie.ad74a.model.MaestroNivSoporte;
import com.ejie.ad74a.model.MaestroSubtpoLlamada;
import com.ejie.ad74a.model.MaestroTipoAlarma;
import com.ejie.ad74a.model.MaestroTipoLlamada;
import com.ejie.ad74a.model.MotivosBaja;
import com.ejie.ad74a.model.Terminales;
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.MotivosQuejasReclamaEnum;
import com.ejie.ad74a.util.constantes.RecursosMovilizadosEnum;
import com.ejie.ad74a.util.constantes.RespuestasTelevidaEnum;
import com.ejie.ad74a.util.constantes.TipoAlarmasEnum;
import com.ejie.ad74a.util.constantes.TipoProtocoloEnum;
import com.ejie.ad74a.util.constantes.TipoResol24Enum;
import com.ejie.ad74a.util.constantes.TipoValoracionEnum;
import com.ejie.ad74a.ws.server.televida.model.AlarmaType;
import com.ejie.ad74a.ws.server.televida.model.Comunicacion;
import com.ejie.ad74a.ws.server.televida.model.ContactoType;
import com.ejie.ad74a.ws.server.televida.model.DatosInstalacionType;
import com.ejie.ad74a.ws.server.televida.model.DatosInstalacionType.DispositivosList;
import com.ejie.ad74a.ws.server.televida.model.DispositivoPropuestoType;
import com.ejie.ad74a.ws.server.televida.model.EmergenciaType;
import com.ejie.ad74a.ws.server.televida.model.EmergenciaType.RecursosMovilizadosList;
import com.ejie.ad74a.ws.server.televida.model.IntervencionType;
import com.ejie.ad74a.ws.server.televida.model.LlamadasRecibidasType;
import com.ejie.ad74a.ws.server.televida.model.ProtocoloType;
import com.ejie.ad74a.ws.server.televida.model.RecursosMovilizadosType;
import com.ejie.ad74a.ws.server.televida.model.Respuesta;
import com.ejie.ad74a.ws.server.televida.model.ValoracionType;
import com.ejie.ad74a.ws.server.televida.model.ValoracionType.DispositivosPropuestos;

@Component
public class ValidacionesPrestador {

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

	@Autowired
	private TerminalesDao terminalesDao;

	@Autowired
	private DispositivosDao dispositivosDao;

	@Autowired
	private MotivosBajaDao motivosBajaDao;

	@Autowired
	private MaestroNivSoporteDao maestroNivSoporteDao;

	@Autowired
	private MaestroEmergenciasDao maestroEmergenciasDao;

	@Autowired
	private MaestroIntervencionesDao maestroIntervencionesDao;

	@Autowired
	private MaestroTipoAlarmaDao maestrotipoAlarmaDao;

	@Autowired
	private MaestroTipoLlamadaDao maestrotipoLlamadaDao;

	@Autowired
	private MaestroSubtpoLlamadaDao maestroSubtpoLlamadaDao;

	/************************
	 * VALIDACIONES INICIALES
	 ************************/

	public Respuesta validacionInicialCabecera(Comunicacion comunicacion) {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialCabecera - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Validar los datos de la cabecera
		// numAbonado: obligatorio. longitud 20
		// idPeticion: obligatorio. longitud 20
		// fComunicacion: obligatorio. Formato

		// numAbonado
		if (null == comunicacion.getCabecera().getNumAbonado()) {
			return RespuestasTelevidaEnum.NUMABONADO_OBLIGATORIO.getRespuesta();
		} else if (comunicacion.getCabecera().getNumAbonado().length() > 20) {
			return RespuestasTelevidaEnum.LONGITUD_CAMPO_NUMABONADO_SOBREPASADA.getRespuesta();
		}

		// idPeticion
		if (null == comunicacion.getCabecera().getIdPeticion()) {
			return RespuestasTelevidaEnum.IDPETICION_OBLIGATORIO.getRespuesta();
		} else if (comunicacion.getCabecera().getIdPeticion().length() > 20) {
			return RespuestasTelevidaEnum.LONGITUD_CAMPO_IDPETICION_SOBREPASADA.getRespuesta();
		}

		// fComunicacion
		if (null == comunicacion.getCabecera().getFComunicacion()) {
			return RespuestasTelevidaEnum.FECHA_COMUNICACION_OBLIGATORIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getCabecera().getFComunicacion());
				UtilidadesFecha.formatearStringToDateFormato(comunicacion.getCabecera().getFComunicacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_COMUNICACION_INCORRECTO.getRespuesta();
			}
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialCabecera - Fin");

		return respuesta;
	}

	public Respuesta validacionInicialAltaInstalacion(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialAltaInstalacion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		Map<String, Object> instalacion = new HashMap<String, Object>();
		instalacion.put("fInstalacion", comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getFInstalacion());
		instalacion.put("motInstFueraPlazo",
				comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getMotInstFueraPlazo());
		instalacion.put("tipoTerminal", comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getTipoTerminal());

		respuesta = validacionInstalacion(instalacion);

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialAltaInstalacion - Fin");

		return respuesta;
	}

	private Respuesta validacionInstalacion(Map<String, Object> instalacion) {
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();
//		motInstFueraPlazo: 1, 2, 3, 4, 5, 6 ó 7
//		fInstalacion: obligatorio.
//		tipoTerminal: obligatorio.
//		controlar formato fecha

		// fInstalacion
		if (null == instalacion.get("fInstalacion")) {
			return RespuestasTelevidaEnum.FECHA_ALTA_INSTALACION_OBLIGATORIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida((String) instalacion.get("fInstalacion"));
				UtilidadesFecha.formatearStringToDateFormato((String) instalacion.get("fInstalacion"),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_ALTA_INSTALACION_INCORRECTA.getRespuesta();
			}
		}

		// motInstFueraPlazo
		if ((int) instalacion.get("motInstFueraPlazo") != 0 && instalacion.get("motInstFueraPlazo") != null
				&& !Utilidades.validarRango(Constantes.UNO, Constantes.SIETE,
						(int) instalacion.get("motInstFueraPlazo"))) {
			return RespuestasTelevidaEnum.MOTIVO_INST_FUERA_PLAZO_INCORRECTO.getRespuesta();
		}
		// Terminal obligatorio
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Se comenta su validación
//		if (null != instalacion.get("tipoTerminal")) {
//			Integer terminal = (int) instalacion.get("tipoTerminal");
//			if (terminal == 0) {
//				return RespuestasTelevidaEnum.TERMINAL_OBLIGATORIO.getRespuesta();
//			}
//		}

		return respuesta;
	}

	public Respuesta validacionInicialUpdate(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialUpdate - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Datos del beneficiario
		Map<String, Object> datosBeneficiario = new HashMap<String, Object>();
		datosBeneficiario.put("tipoBeneficiario",
				comunicacion.getDatosModificacion().getDatosBeneficiario().getTipoBeneficiario());
		datosBeneficiario.put("idiomaPrestServicio",
				comunicacion.getDatosModificacion().getDatosBeneficiario().getIdiomaPrestServicio());
		datosBeneficiario.put("movil", comunicacion.getDatosModificacion().getDatosBeneficiario().getMovil());
		datosBeneficiario.put("email", comunicacion.getDatosModificacion().getDatosBeneficiario().getEmail());
		datosBeneficiario.put("telefonoServicio",
				comunicacion.getDatosModificacion().getDatosBeneficiario().getTelefonoServicio());
		respuesta = validacionInicialDatosBeneficiario(datosBeneficiario);

		// Validación de los contactos
		if (comunicacion.getDatosModificacion().getContactosList() != null) {
			return validacionInicialContactos(comunicacion.getDatosModificacion().getContactosList().getContacto());
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialUpdate - Fin");

		return respuesta;
	}

	private Respuesta validacionInicialDatosBeneficiario(Map<String, Object> datosBeneficiario) {

		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// tipoBeneficiario: obligatorio. 1, 2 ó 3
		// idiomaPrestacionServicio: obligatorio. 0 ó 1
		// email: email válido
		// controlar longitudes máximas de campos String

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Se comenta su validación
//		// tipoBeneficiario
//		if (datosBeneficiario.get("tipoBeneficiario") == null) {
//			return RespuestasTelevidaEnum.TIPO_BENEFICIARIO_OBLIGATORIO.getRespuesta();
//		}

//		if (!Utilidades.validarRango(Constantes.UNO, Constantes.TRES,
//				(int) datosBeneficiario.get("tipoBeneficiario"))) {
//			return respuesta = RespuestasTelevidaEnum.TIPO_BENEFICIARIO_OBLIGATORIO.getRespuesta();
//		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Se comenta su validación
//		// idiomaPrestacionServicio
//		if (datosBeneficiario.get("idiomaPrestServicio") == null) {
//			return RespuestasTelevidaEnum.IDIOMA_PRESTACION_SERVICIO_OBLIGATORIO.getRespuesta();
//		}
//
//		if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
//				(int) datosBeneficiario.get("idiomaPrestServicio"))) {
//			return respuesta = RespuestasTelevidaEnum.IDIOMA_PRESTACION_SERVICIO_INCORRECTO.getRespuesta();
//		}

		// email longitud
		if (datosBeneficiario.get("email") != null && ((String) datosBeneficiario.get("email")).length() > 100) {
			return respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_EMAIL_SOBREPASADA.getRespuesta();
		}
		// email formato
		if (datosBeneficiario.get("email") != null
				&& !Utilidades.validarEmail((String) datosBeneficiario.get("email"))) {
			return respuesta = RespuestasTelevidaEnum.EMAIL_INCORRECTO.getRespuesta();
		}

		// movil longitud
		if (datosBeneficiario.get("movil") != null && ((String) datosBeneficiario.get("movil")).length() > 20) {
			return respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_MOVIL_SOBREPASADA.getRespuesta();
		}

		// telefonoServicio longitud
		if (datosBeneficiario.get("telefonoServicio") != null
				&& ((String) datosBeneficiario.get("telefonoServicio")).length() > 20) {
			return respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_TELEFONO_SOBREPASADA.getRespuesta();
		}

		return respuesta;
	}

	private Respuesta validacionInicialContactos(List<ContactoType> contactos) {
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Nombre: !obligatorio
		// poseeLlaves: !obligatorio. 0 o 1
		// tlf1: obligatorio. Teléfono válido
		// esContactoInstalacion: !obligatorio. 0 o 1
		// controlar longitudes máximas de campos String

		for (ContactoType contacto : contactos) {

			// numDocumento
			if (contacto.getNumDocumento() != null && contacto.getNumDocumento().length() > 20) {
				return RespuestasTelevidaEnum.LONGITUD_CAMPO_NUMDOCUMENTO_SOBREPASADA.getRespuesta();
			}

			// nombre
//			if (contacto.getNombre() == null) {
//				return RespuestasTelevidaEnum.NOMBRE_CONTACTO_OBLIGATORIO.getRespuesta();
//			}
			if (contacto.getNombre().length() > 50) {
				return RespuestasTelevidaEnum.LONGITUD_CAMPO_NOMBRE_SOBREPASADA.getRespuesta();
			}

			// ape1
			if (contacto.getApe1() != null && contacto.getApe1().length() > 100) {
				return RespuestasTelevidaEnum.LONGITUD_CAMPO_APE1_SOBREPASADA.getRespuesta();
			}

			// ape2
			if (contacto.getApe2() != null && contacto.getApe2().length() > 100) {
				return RespuestasTelevidaEnum.LONGITUD_CAMPO_APE2_SOBREPASADA.getRespuesta();
			}

			// poseeLlaves
			if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO, contacto.getPoseeLlaves())) {
				return RespuestasTelevidaEnum.POSEE_LLAVES_CONTACTO_INCORRECTO.getRespuesta();
			}

			// esContactoInstalacion
			if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO, contacto.getEsContactoInstalacion())) {
				return RespuestasTelevidaEnum.POSEE_LLAVES_CONTACTO_INCORRECTO.getRespuesta();
			}

			// tlf1
			if (contacto.getTlf1() == null) {
				return RespuestasTelevidaEnum.TLF1_CONTACTO_OBLIGATORIO.getRespuesta();
			}

			// tlg1, tlf2 y tlf3
			if (contacto.getTlf1().length() > 20 || (contacto.getTlf2() != null && contacto.getTlf2().length() > 20)
					|| (contacto.getTlf3() != null && contacto.getTlf3().length() > 20)) {
				return respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_TELEFONO_SOBREPASADA.getRespuesta();
			}

		}

		return respuesta;
	}

	public Respuesta validacionInicialBajaBeneficiario(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialBajaBeneficiario - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// fBajaBeneficiario: obligatorio
		// motivoBaja: obligatorio
		// canalComunicacion: obligatorio. 1, 2, 3 (contra enum CanalComunicacionEnum)
		// mantenerinstalacion: obligatorio. 0 ó 1
		// orgenComunicacion: 1, 2
		// controlar longitudes máximas de campos String
		// controlar el formato de las fechas

		// fBajaBeneficiario
		if (null == comunicacion.getDatosBajaBeneficiario().getFBajaBeneficiario()) {
			return RespuestasTelevidaEnum.FECHA_BAJA_BENEFICIARIO_OBLIGATORIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getDatosBajaBeneficiario().getFBajaBeneficiario());
				UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosBajaBeneficiario().getFBajaBeneficiario(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_BAJA_BENEFICIARIO_INCORRECTA.getRespuesta();
			}
		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
		// motivoBaja: obligatorio.
//		if (comunicacion.getDatosBajaBeneficiario().getMotivoBaja() == 0) {
//			return RespuestasTelevidaEnum.MOTIVO_BAJA_OBLIGATORIO.getRespuesta();
//		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
		// Canal comunicacion
//		if (!Utilidades.validarRango(Constantes.UNO, Constantes.TRES,
//				comunicacion.getDatosBajaBeneficiario().getCanalComunicacion())) {
//			return RespuestasTelevidaEnum.CANAL_COMUNICACION_OBLIGATORIO.getRespuesta();
//		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
//		// Mantener Instalacion
//		if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
//				comunicacion.getDatosBajaBeneficiario().getMantenerInst())) {
//			return RespuestasTelevidaEnum.MANTENER_INSTALACION_OBLIGATORIO.getRespuesta();
//		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
//		// Origen Comunicacion
//		if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
//				comunicacion.getDatosBajaBeneficiario().getOrigenComunicacion())) {
//			return RespuestasTelevidaEnum.ORIGEN_COMUNICACION_OBLIGATORIO.getRespuesta();
//		}

		// observaciones longitud
		if (comunicacion.getDatosBajaBeneficiario().getObservaciones() != null
				&& comunicacion.getDatosBajaBeneficiario().getObservaciones().length() > 1750) {
			RespuestasTelevidaEnum.LONGITUD_CAMPO_OBSERVACIONES_SOBREPASADA.getRespuesta();
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialBajaBeneficiario - Fin");

		return respuesta;
	}

	public Respuesta validacionInicialBajaInstalacion(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialBajaInstalacion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// fBajaInstalacion: obligatorio
		// controlar longitudes máximas de campos String
		// controlar el formato de las fechas

		// fBajaInstalacion
		if (null == comunicacion.getDatosBajaInstalacion().getFBajaInstalacion()) {
			return RespuestasTelevidaEnum.FECHA_BAJA_INSTALACION_OBLIGATOTIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getDatosBajaInstalacion().getFBajaInstalacion());
				UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosBajaInstalacion().getFBajaInstalacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_BAJA_INSTALACION_INCORRECTA.getRespuesta();
			}
		}

		// Observaciones
		if (comunicacion.getDatosBajaInstalacion().getObservaciones() != null
				&& comunicacion.getDatosBajaInstalacion().getObservaciones().length() > 1750) {
			respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_OBSERVACIONES_SOBREPASADA.getRespuesta();
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialBajaInstalacion - Fin");

		return respuesta;
	}

	public Respuesta validacionInicialPrestacion(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialPrestacion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Lista de revalorizaciones
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
//		if (comunicacion.getDatosPrestServicio().getRevalorizacionesList() != null) {
//			for (ValoracionType revalorizacion : comunicacion.getDatosPrestServicio().getRevalorizacionesList()
//					.getRevalorizacion()) {
//
//				// revalorización
//				Map<String, Object> datosValoracion = new HashMap<String, Object>();
//				datosValoracion.put("tipoValoracion", revalorizacion.getTipoValoracion());
//				datosValoracion.put("modoValoracion", revalorizacion.getModoValoracion());
//				datosValoracion.put("fValoracion", revalorizacion.getFValoracion());
//				datosValoracion.put("altoRiesgo", revalorizacion.getAltoRiesgo());
//				datosValoracion.put("nivelSoporte", revalorizacion.getNivelSoporte());
//				datosValoracion.put("nivelRiesgoMaltrato", revalorizacion.getNivelRiesgoMaltrato());
//				datosValoracion.put("periodicidadAceptada", revalorizacion.getPeriodicidadAceptada());
//				datosValoracion.put("idiomaSolicitante", revalorizacion.getIdiomaSolicitante());
//				datosValoracion.put("motivosRetrasoValoracion", revalorizacion.getMotivosRetrasoRevaloracion());
//				datosValoracion.put("contratoActuacion", revalorizacion.getContratoActuacion());
//
//				respuesta = validacionInicialDatosValoracion(datosValoracion, TipoValoracionEnum.PERIODICA);
//				if (!RespuestasTelevidaEnum.EN_PROCESO.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
//					return respuesta;
//				}
//			}
//		}

		// Listado de emergencias
		// tipoEmergencia: obligatorio.
		// fEmergencia: obligatorio
		// recursosMovilizados: cada elemento RecursosMovilizados
		// - recursoMovilizado: obligatorio.1, 2, 3, 4, ó 5 (RecursosMovilizadosEnum)
		// - tiempoLlegada: formato hh:mm:ss
		// controlar el formato de las fechas
		if (comunicacion.getDatosPrestServicio() != null
				&& comunicacion.getDatosPrestServicio().getEmergenciasList() != null) {
			for (EmergenciaType emergencia : comunicacion.getDatosPrestServicio().getEmergenciasList()
					.getEmergencia()) {
				if (emergencia.getTipoEmergencia() == null || emergencia.getTipoEmergencia() == 0) {
					return respuesta = RespuestasTelevidaEnum.TIPO_EMERGENCIA_OBLIGATORIO.getRespuesta();
				}

				// fEmergencia
				if (null == emergencia.getFEmergencia()) {
					return RespuestasTelevidaEnum.FECHA_EMERGENCIA_OBLIGATORIO.getRespuesta();
				} else {
					try {
//						UtilidadesFecha.parsearFechaTelevida(emergencia.getFEmergencia());
						UtilidadesFecha.formatearStringToDateFormato(emergencia.getFEmergencia(),
								Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
					} catch (Exception e) {
						return RespuestasTelevidaEnum.FECHA_EMERGENCIA_INCORRECTA.getRespuesta();
					}
				}

				// recursosMovilizados
				RecursosMovilizadosList recursosMovilizadosList = emergencia.getRecursosMovilizadosList();
				if (recursosMovilizadosList != null) {
					for (RecursosMovilizadosType recursosMovilizados : recursosMovilizadosList
							.getRecursosMovilizados()) {
						if (!RecursosMovilizadosEnum
								.exists(Long.valueOf(recursosMovilizados.getTiposRecursoMovilizados()))) {
							return RespuestasTelevidaEnum.RECURSO_MOVILIZADO_INCORRECTO.getRespuesta();
						}
						// tiempoLlegada: formato hh:mm:ss
						if (recursosMovilizados.getTiempoLlegada() != null) {
							try {
								DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
								String tiempoLlegada = recursosMovilizados.getTiempoLlegada().toString();
								LocalTime time = LocalTime.parse(tiempoLlegada, formatter);
								// UtilidadesFecha.parsearFechaTelevida(fecha)(recursosMovilizados.getTiempoLlegada());
							} catch (Exception e) {
								return RespuestasTelevidaEnum.TIEMPO_LLEGADA_EMERGENCIA_INCORRECTA.getRespuesta();
							}
						}
					}
				}
			}
		}

		// Alarmas
		if (comunicacion.getDatosPrestServicio() != null
				&& comunicacion.getDatosPrestServicio().getAlarmasList() != null) {

			for (AlarmaType alarma : comunicacion.getDatosPrestServicio().getAlarmasList().getAlarma()) {

				// tipoAlarma
				if (alarma.getTipoAlarma() == null || alarma.getTipoAlarma().getTipoAlarma() == 0) {
					return respuesta = RespuestasTelevidaEnum.TIPO_ALARMA_OBLIGATORIO.getRespuesta();
				}

				if (!TipoAlarmasEnum.exists(alarma.getTipoAlarma().getTipoAlarma() + "")) {
					return RespuestasTelevidaEnum.TIPO_ALARMA_INCORRECTA.getRespuesta();
				}

				// TIPO DISPOSITIVO SEGURIDAD: obligatorio si tipoAlarma = 3
//				Estos datos no nos los informan en Fase I
//				if (alarma.getTipoAlarma().getTipoAlarma() == Constantes.TRES
//						&& alarma.getTipoAlarma().getTipoDispositivoSeguridad() == null) {
//					return RespuestasTelevidaEnum.TIPO_DISP_SEGURIDAD_OBLIGATORIO.getRespuesta();
//
//				}

				// tipoDispositivoFuncional: obligatorio si tipoAlarma = 1
//				Estos datos no nos los informan en Fase I
//				if (alarma.getTipoAlarma().getTipoAlarma() == Constantes.UNO
//						&& alarma.getTipoAlarma().getTipoDispositivoFuncional() == null) {
//					return RespuestasTelevidaEnum.TIPO_DISPOSITIVO_FUNCIONAL_OBLIGATORIO.getRespuesta();
//				}

				// llamada
				if (alarma.getTipoAlarma().getTipoAlarma() == Constantes.DOS) {

					// Estos datos no nos los informan en Fase I así que no lo tratamos
					// obligatorio si tipoAlarma = 2
//					if (alarma.getTipoAlarma().getLlamada() == null) {
//						return RespuestasTelevidaEnum.LLAMADA_OBLIGATORIA.getRespuesta();
//					} else {
//
//						// • llamadasRecibidas o llamadasEmitidas obligatorios
//						if (alarma.getTipoAlarma().getLlamada().getLlamadasRecibidas() == null
//								&& alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas() == null) {
//							return RespuestasTelevidaEnum.LLAMADAS_RECIBIDAS_EMITIDAS_OBLIGATORIO.getRespuesta();
//						}
//
//						if (alarma.getTipoAlarma().getLlamada().getLlamadasRecibidas() != null
//								&& alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas() != null) {
//							return RespuestasTelevidaEnum.LLAMADAS_RECIBIDAS_EMITIDAS_INCORRECTO.getRespuesta();
//						}
//
//						// duración: valores de 1 a 9999 (indica minutos)
//						if (!Utilidades.validarRango(Constantes.UNO, Constantes.NUEVEMIL_NOVECIENTOS_NOVENTAYNUEVE,
//								alarma.getTipoAlarma().getLlamada().getDuracion())) {
//							return RespuestasTelevidaEnum.DURACION_LLAMADA_INCORRECTA.getRespuesta();
//						}
//						// tiempo respuesta • tiempoRespuesta: valores de 1 a 9999 (indica minutos)
//						if (!Utilidades.validarRango(Constantes.UNO, Constantes.NUEVEMIL_NOVECIENTOS_NOVENTAYNUEVE,
//								alarma.getTipoAlarma().getLlamada().getTiempoRespuesta())) {
//							return RespuestasTelevidaEnum.TIEMPO_RESPUESTA_INCORRECTO.getRespuesta();
//						}
//						// idLlamada
//						if (alarma.getTipoAlarma().getLlamada().getIdLlamada() != null
//								&& alarma.getTipoAlarma().getLlamada().getIdLlamada().length() > 20) {
//							return RespuestasTelevidaEnum.LONGITUD_CAMPO_IDLLAMADA_SOBREPASADA.getRespuesta();
//						}
//
//						// RESPUESTA 0 Ó 1
//						if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
//								alarma.getTipoAlarma().getLlamada().getRespuesta())) {
//							return RespuestasTelevidaEnum.VALOR_LLAMADA_RESPUESTA_INCORRECTO.getRespuesta();
//						}
//					}
				}

				// fecha
				if (null == alarma.getFecha()) {
					return RespuestasTelevidaEnum.FECHA_ALARMA_OBLIGATORIO.getRespuesta();
				} else {
					// Validamos la fecha de Valoracion recibida
					try {
						// UtilidadesFecha.parsearFechaTelevida(alarma.getFecha());
						UtilidadesFecha.formatearStringToDateFormato(alarma.getFecha(),
								Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
					} catch (Exception e) {
						return RespuestasTelevidaEnum.FECHA_ALARMA_INCORRECTA.getRespuesta();
					}
				}

				// tipoResolAlarma
				if (0 != alarma.getTiposResolAlarma() && !TipoResol24Enum.exists(alarma.getTiposResolAlarma() + "")) {
					return RespuestasTelevidaEnum.TIPO_RESOL_ALARMA_INCORRECTO.getRespuesta();
				}
			}
		}

		// Intervenciones
		if (comunicacion.getDatosPrestServicio() != null
				&& comunicacion.getDatosPrestServicio().getIntervencionesList() != null) {
			for (IntervencionType intervencion : comunicacion.getDatosPrestServicio().getIntervencionesList()
					.getIntervencion()) {
				// tipoIntervencion: obligatorio
				if (intervencion.getTipoIntervencion() == 0) {
					return RespuestasTelevidaEnum.TIPO_INTERVENCION_OBLIGATORIO.getRespuesta();
				}

				// fIntervencion: obligatorio
				if (null == intervencion.getFIntervencion()) {
					return RespuestasTelevidaEnum.FECHA_INTERVENCION_OBLIGATORIO.getRespuesta();
				} else {
					try {
//						UtilidadesFecha.parsearFechaTelevida(intervencion.getFIntervencion());
						UtilidadesFecha.formatearStringToDateFormato(intervencion.getFIntervencion(),
								Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
					} catch (Exception e) {
						return RespuestasTelevidaEnum.FECHA_INTERVENCION_INCORRECTA.getRespuesta();
					}
				}
			}
		}

		// Protocolos
		if (comunicacion.getDatosPrestServicio() != null
				&& comunicacion.getDatosPrestServicio().getProtocolosList() != null) {
			for (ProtocoloType protocolo : comunicacion.getDatosPrestServicio().getProtocolosList().getProtocolo()) {
				// tipoProtocolo: obligatorio 1, 2 ó 3 (contra enum TipoProtocoloEnum)
				if (!TipoProtocoloEnum.exists(protocolo.getTipoProtocolo() + "")) {
					return RespuestasTelevidaEnum.TIPO_PROTOCOLO_INCORRECTO.getRespuesta();
				}

				// fEntrada: obligatorio
				if (null == protocolo.getFEntrada()) {
					return RespuestasTelevidaEnum.FECHA_ENTRADA_OBLIGATORIO.getRespuesta();
				} else {
					try {
//						UtilidadesFecha.parsearFechaTelevida(protocolo.getFEntrada());
						UtilidadesFecha.formatearStringToDateFormato(protocolo.getFEntrada(),
								Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
					} catch (Exception e) {
						return RespuestasTelevidaEnum.FECHA_ENTRADA_INCORRECTA.getRespuesta();
					}
				}

				// fSalida: obligatorio
				if (null == protocolo.getFSalida()) {
					return RespuestasTelevidaEnum.FECHA_SALIDA_OBLIGATORIO.getRespuesta();
				} else {
					try {
//						UtilidadesFecha.parsearFechaTelevida(protocolo.getFSalida());
						UtilidadesFecha.formatearStringToDateFormato(protocolo.getFSalida(),
								Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
					} catch (Exception e) {
						return RespuestasTelevidaEnum.FECHA_SALIDA_INCORRECTA.getRespuesta();
					}
				}
			}
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialPrestacion - Fin");

		return respuesta;
	}

	public Respuesta validacionInicialQuejas(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialQuejas - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// fQuejaReclamacion: obligatorio
		// procedente: obligatorio. 0 ó 1
		// estado: obligatorio. 0 ó 1
		// motivosQuejasReclama: obligatorio (contra enum MotivosQuejasReclamaEnum)
		// controlar longitudes máximas de campos String
		// controlar el formato de las fechas

		// validar fQuejaReclamacion obligatorio
		if (null == comunicacion.getDatosQuejasReclamaciones().getFQuejaReclamacion()) {
			return RespuestasTelevidaEnum.FECHA_QUEJA_OBLIGATORIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida(comunicacion.getDatosQuejasReclamaciones().getFQuejaReclamacion());
				UtilidadesFecha.formatearStringToDateFormato(
						comunicacion.getDatosQuejasReclamaciones().getFQuejaReclamacion(),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_QUEJA_INCORRECTA.getRespuesta();
			}
		}

		// procedente obligatorio 0 o 1
		if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
				comunicacion.getDatosQuejasReclamaciones().getProcedente())) {
			return RespuestasTelevidaEnum.PROCEDENTE_INCORRECTO.getRespuesta();
		}
		// estado 0 o 1
		if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO,
				comunicacion.getDatosQuejasReclamaciones().getEstado())) {
			return RespuestasTelevidaEnum.ESTADO_QUEJA_INCORRECTO.getRespuesta();
		}

		// tiempoResolucion 0 - 999999 (5 dígitos)
		if (comunicacion.getDatosQuejasReclamaciones().getTiempoResolucion() != null
				&& (comunicacion.getDatosQuejasReclamaciones().getTiempoResolucion().compareTo(BigInteger.ZERO) < 0
						|| comunicacion.getDatosQuejasReclamaciones().getTiempoResolucion()
								.compareTo(BigInteger.valueOf(999999L)) > 0)) {
			return RespuestasTelevidaEnum.ESTADO_QUEJA_INCORRECTO.getRespuesta();
		}

		// motivosQueja obligatorio contra enum MotivosQuejasReclamaEnum
		if (!MotivosQuejasReclamaEnum
				.exists(comunicacion.getDatosQuejasReclamaciones().getMotivosQuejasReclama() + "")) {
			return RespuestasTelevidaEnum.MOTIVO_QUEJA_INCORRECTO.getRespuesta();

		}

		// observaciones
		if (comunicacion.getDatosQuejasReclamaciones().getObservaciones() != null
				&& comunicacion.getDatosQuejasReclamaciones().getObservaciones().length() > 1750) {
			respuesta = RespuestasTelevidaEnum.LONGITUD_CAMPO_OBSERVACIONES_SOBREPASADA.getRespuesta();
		}
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialQuejas - Fin");

		return respuesta;
	}

	public Respuesta validacionInicialValoracion(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialValoracion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Valoracion
		// Se comenta la validión pq en FASE ! no se informará
//		if (comunicacion.getDatosValoracionInicial().getDatosValoracion() == null) {
//			return RespuestasTelevidaEnum.DATOS_VALORACION_OBLIGATORIO.getRespuesta();
//		} else {
//			Map<String, Object> datosValoracion = new HashMap<String, Object>();
//			ValoracionType valoracion = comunicacion.getDatosValoracionInicial().getDatosValoracion();
//			datosValoracion.put("tipoValoracion", valoracion.getTipoValoracion());
//			datosValoracion.put("modoValoracion", valoracion.getModoValoracion());
//			datosValoracion.put("fValoracion", valoracion.getFValoracion());
//			datosValoracion.put("altoRiesgo", valoracion.getAltoRiesgo());
//			datosValoracion.put("nivelSoporte", valoracion.getNivelSoporte());
//			datosValoracion.put("nivelRiesgoMaltrato", valoracion.getNivelRiesgoMaltrato());
//			datosValoracion.put("periodicidadAceptada", valoracion.getPeriodicidadAceptada());
//			datosValoracion.put("idiomaSolicitante", valoracion.getIdiomaSolicitante());
//			datosValoracion.put("motivosRetrasoValoracion", valoracion.getMotivosRetrasoRevaloracion());
//			datosValoracion.put("contratoActuacion", valoracion.getContratoActuacion());
//
//			respuesta = validacionInicialDatosValoracion(datosValoracion, TipoValoracionEnum.INICIAL);
//		}
		if (!RespuestasTelevidaEnum.EN_PROCESO.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
			return respuesta;
		}

		// Datos del beneficiario
		if (comunicacion.getDatosValoracionInicial().getDatosBeneficiario() == null) {
			return RespuestasTelevidaEnum.DATOS_BENEFICIARIO_OBLIGATORIO.getRespuesta();
		} else {
			Map<String, Object> datosBeneficiario = new HashMap<String, Object>();
			datosBeneficiario.put("tipoBeneficiario",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getTipoBeneficiario());
			datosBeneficiario.put("idiomaPrestServicio",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getIdiomaPrestServicio());
			datosBeneficiario.put("movil", comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getMovil());
			datosBeneficiario.put("email", comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getEmail());
			datosBeneficiario.put("telefonoServicio",
					comunicacion.getDatosValoracionInicial().getDatosBeneficiario().getTelefonoServicio());
			respuesta = validacionInicialDatosBeneficiario(datosBeneficiario);
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialValoracion - Fin");

		return respuesta;
	}

	private Respuesta validacionInicialDatosValoracion(Map<String, Object> datosValoracion,
			TipoValoracionEnum tipoValoracion) {

		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

//		tipoValoracion: obligatorio. Validar contra parámetro tipoValoracion
//		modoValoracion: obligatorio. 1, 2 ó 3
//		fValoracion: obligatorio
//		nivelSoporte: obligatorio
//		altoRiesgo: obligatorio. 0 ó 1
//		nivelRiesgoMaltrato: 1, 2 ó 3
//		periodicidadAceptada: 0 ó 1
//		idiomaSolicitante: 0, 1 o un texto de hasta 60
//		motivosRetrasoRevaloracion: 1, 2, 3, 4 o 5
//		controlar longitudes máximas de campos String
//		controlar el formato de las fechas

		// ValoracionType valoracion =
		// comunicacion.getDatosValoracionInicial().getDatosValoracion();
		// tipoValoracion
		if (Integer.valueOf(tipoValoracion.getId()) != (Integer) datosValoracion.get("tipoValoracion")) {
			return RespuestasTelevidaEnum.TIPO_VALORACION_INCORRECTO.getRespuesta();
		}
		// modoValoracion
		if (!Utilidades.validarRango(Constantes.UNO, Constantes.TRES, (int) datosValoracion.get("modoValoracion"))) {
			return RespuestasTelevidaEnum.MODO_VALORACION_INCORRECTO.getRespuesta();
		}

		// fValoracion
		if (null == datosValoracion.get("fValoracion")) {
			return RespuestasTelevidaEnum.FECHA_VALORACION_OBLIGATORIO.getRespuesta();
		} else {
			// Validamos la fecha de Valoracion recibida
			try {
//				UtilidadesFecha.parsearFechaTelevida((String) datosValoracion.get("fValoracion"));
				UtilidadesFecha.formatearStringToDateFormato((String) datosValoracion.get("fValoracion"),
						Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT);
			} catch (Exception e) {
				return RespuestasTelevidaEnum.FECHA_VALORACION_INCORRECTA.getRespuesta();
			}
		}

		// altoRiesgo: obligatorio. 0 ó 1
		if (datosValoracion.get("altoRiesgo") != null
				&& !Utilidades.validarRango(Constantes.CERO, Constantes.UNO, (int) datosValoracion.get("altoRiesgo"))) {
			return RespuestasTelevidaEnum.ALTO_RIESGO_INCORRECTO.getRespuesta();
		}

		// Nivel soporte
		if (datosValoracion.get("nivelSoporte") == null) {
			return RespuestasTelevidaEnum.NIVEL_SOPORTE_OBLIGATORIO.getRespuesta();
		}

		// nivelRiesgoMaltrato: 1, 2 ó 3
		if (datosValoracion.get("nivelRiesgoMaltrato") != null
				&& Constantes.CERO != (int) datosValoracion.get("nivelRiesgoMaltrato")
				&& !Utilidades.validarRango(Constantes.UNO, Constantes.TRES,
						(int) datosValoracion.get("nivelRiesgoMaltrato"))) {
			return RespuestasTelevidaEnum.NIVEL_RIESGO_MALTRATO_INCORRECTO.getRespuesta();
		}

		// periodicidadAceptada: 0 ó 1
		if (datosValoracion.get("periodicidadAceptada") != null && !Utilidades.validarRango(Constantes.CERO,
				Constantes.UNO, (int) datosValoracion.get("periodicidadAceptada"))) {
			return RespuestasTelevidaEnum.PERIOCIDAD_ACEPTADA_INCORRECTA.getRespuesta();
		}

		// idiomaSolicitante: 0, 1 o un texto de hasta 60
		if (datosValoracion.get("idiomaSolicitante") != null && (!"0".equals(datosValoracion.get("idiomaSolicitante"))
				&& !"1".equals(datosValoracion.get("idiomaSolicitante"))
				&& ((String) datosValoracion.get("idiomaSolicitante")).length() >= 60)) {
			return RespuestasTelevidaEnum.IDIOMA_SOLICITANTE_INCORRECTO.getRespuesta();
		}

		// motivosRetrasoRevaloracion: 1, 2, 3, 4 ó 5
		if (null != datosValoracion.get("motivosRetrasoRevaloracion")
				&& Constantes.CERO != (int) datosValoracion.get("motivosRetrasoRevaloracion")
				&& !Utilidades.validarRango(Constantes.UNO, Constantes.CINCO,
						(int) datosValoracion.get("motivosRetrasoRevaloracion"))) {
			return RespuestasTelevidaEnum.MOTIVO_RETRASO_VALORACION_INCORRECTO.getRespuesta();
		}

		// contrato actuacion lengh <300
		if (datosValoracion.get("contratoActuacion") != null
				&& ((String) datosValoracion.get("contratoActuacion")).length() > 300) {
			return RespuestasTelevidaEnum.LONGITUD_CAMPO_CONTRATO_ACTUACION_SOBREPASADA.getRespuesta();
		}

		return respuesta;
	}

	public Respuesta validacionInicialCambioDomicilio(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialCambioDomicilio - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.EN_PROCESO.getRespuesta();

		// Instalación
		Map<String, Object> instalacion = new HashMap<String, Object>();
		instalacion.put("fInstalacion", comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getFInstalacion());
		instalacion.put("motInstFueraPlazo",
				comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getMotInstFueraPlazo());
		instalacion.put("tipoTerminal", comunicacion.getDatosCambioDomicilio().getDatosInstalacion().getTipoTerminal());
		respuesta = validacionInstalacion(instalacion);

		if (!RespuestasTelevidaEnum.EN_PROCESO.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
			return respuesta;
		}

		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación
		// Valoracion
//		Map<String, Object> datosValoracion = new HashMap<String, Object>();
//		ValoracionType valoracion = comunicacion.getDatosCambioDomicilio().getDatosValoracion();
//		datosValoracion.put("tipoValoracion", valoracion.getTipoValoracion());
//		datosValoracion.put("modoValoracion", valoracion.getModoValoracion());
//		datosValoracion.put("fValoracion", valoracion.getFValoracion());
//		datosValoracion.put("altoRiesgo", valoracion.getAltoRiesgo());
//		datosValoracion.put("nivelSoporte", valoracion.getNivelSoporte());
//		datosValoracion.put("nivelRiesgoMaltrato", valoracion.getNivelRiesgoMaltrato());
//		datosValoracion.put("periodicidadAceptada", valoracion.getPeriodicidadAceptada());
//		datosValoracion.put("idiomaSolicitante", valoracion.getIdiomaSolicitante());
//		datosValoracion.put("motivosRetrasoValoracion", valoracion.getMotivosRetrasoRevaloracion());
//		datosValoracion.put("contratoActuacion", valoracion.getContratoActuacion());

//		respuesta = validacionInicialDatosValoracion(datosValoracion, TipoValoracionEnum.CAMBIO_DOMICILIO);
//		if (!RespuestasTelevidaEnum.EN_PROCESO.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
//			return respuesta;
//		}

		// Datos del beneficiario
		if (comunicacion.getDatosCambioDomicilio().getDatosBeneficiario() == null) {
			return RespuestasTelevidaEnum.DATOS_BENEFICIARIO_OBLIGATORIO.getRespuesta();
		} else {
			Map<String, Object> datosBeneficiario = new HashMap<String, Object>();
			if (comunicacion.getDatosCambioDomicilio().getDatosBeneficiario() != null) {
				datosBeneficiario.put("tipoBeneficiario",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTipoBeneficiario());
				datosBeneficiario.put("idiomaPrestServicio",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getIdiomaPrestServicio());
				datosBeneficiario.put("movil",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getMovil());
				datosBeneficiario.put("email",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getEmail());
				datosBeneficiario.put("telefonoServicio",
						comunicacion.getDatosCambioDomicilio().getDatosBeneficiario().getTelefonoServicio());
				respuesta = validacionInicialDatosBeneficiario(datosBeneficiario);
			}
		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validacionInicialCambioDomicilio - Fin");

		return respuesta;
	}

	/**************************
	 * VALIDACIONES AL PROCESAR
	 **************************/

	public Respuesta validarProccesAltaInst(Comunicacion comunicacion) throws Throwable {
		// tipoTerminal: obligatorio. 1, 2, 3, 4 ó 5 (contra maestro AD74A34T00)
		// dispositivosList:
		// - cada valor: 1, 2, 3, 4, 5, 6, 7 ó 8 (contra maestro AD74A35T00)
		// controlar formato fecha

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesAltaInst - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// Terminal contra maestro AD74A34T00
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		if (null != comunicacion.getDatosAltaInstalacion().getDatosInstalacion()) {
//			Integer terminal = comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getTipoTerminal();
//			Terminales terminales = this.terminalesDao.find(new Terminales(terminal.longValue()));
//			if (null == terminales || null == terminales.getIdTerminal34()) {
//				return RespuestasTelevidaEnum.TERMINAL_INCORRECTO.getRespuesta();
//			}
//		}
		// Dispositivos
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		if (comunicacion.getDatosAltaInstalacion() != null
//				&& comunicacion.getDatosAltaInstalacion().getDatosInstalacion().getDispositivosList() != null) {
//			DispositivosList dispList = comunicacion.getDatosAltaInstalacion().getDatosInstalacion()
//					.getDispositivosList();
//			for (Integer idDisp : dispList.getDispositivo()) {
//				Dispositivos dispositivos = this.dispositivosDao.find(new Dispositivos(idDisp.longValue()));
//				if (null == dispositivos || null == dispositivos.getIdDispositivo35()) {
//					return RespuestasTelevidaEnum.DISPOSITIVO_INCORRECTO.getRespuesta();
//				}
//			}
//		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesAltaInst - Fin");
		return respuesta;
	}

	public Respuesta validarProccesBajaBeneficiario(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesBajaBeneficiario - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// motivoBaja: contra maestro AD74A33T00 con campo BAJA_33 = 0
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Comentamos su validación al procesar
//		MotivosBaja motivoBaja = new MotivosBaja();
//		motivoBaja.setIdMotivoBaja33(Long.valueOf(comunicacion.getDatosBajaBeneficiario().getMotivoBaja()));
//		motivoBaja.setBaja33("0");
//		List<MotivosBaja> listMotivos = motivosBajaDao.findAll(motivoBaja, null);
//		if (listMotivos.isEmpty()) {
//			return RespuestasTelevidaEnum.MOTIVO_BAJA_INCORRECTO.getRespuesta();
//		}

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesBajaBeneficiario - Fin");
		return respuesta;

	}

	public Respuesta validarProccesPrestacion(Comunicacion comunicacion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesValoracion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// Revalorizaciones
		if (comunicacion.getDatosPrestServicio().getRevalorizacionesList() != null) {
			for (ValoracionType revalorizacion : comunicacion.getDatosPrestServicio().getRevalorizacionesList()
					.getRevalorizacion()) {
				respuesta = this.validarProccesValoracion(revalorizacion);
				if (!RespuestasTelevidaEnum.OK.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
					return respuesta;
				}
			}
		}

		// Emergencias
		if (comunicacion.getDatosPrestServicio().getEmergenciasList() != null) {
			for (EmergenciaType emergencia : comunicacion.getDatosPrestServicio().getEmergenciasList()
					.getEmergencia()) {
				// tipoEmergencia: contra maestro AD74A46T00
				Integer tipoEmergencia = emergencia.getTipoEmergencia();
				MaestroEmergencias maestroEmergencias = this.maestroEmergenciasDao
						.find(new MaestroEmergencias(tipoEmergencia.longValue()));
				if (null == maestroEmergencias || null == maestroEmergencias.getIdTipoEmergencia46()) {
					return RespuestasTelevidaEnum.TIPO_EMERGENCIA_INCORRECTO.getRespuesta();
				}
			}
		}

		// Alarmas
		if (comunicacion.getDatosPrestServicio().getAlarmasList() != null) {
			respuesta = validarProcessAlarmas(comunicacion.getDatosPrestServicio().getAlarmasList().getAlarma());
			if (!RespuestasTelevidaEnum.OK.getCodRespuesta().equals(respuesta.getCodRespuesta())) {
				return respuesta;
			}
		}

		// Intervenciones
		if (comunicacion.getDatosPrestServicio().getIntervencionesList() != null) {
			for (IntervencionType intervencion : comunicacion.getDatosPrestServicio().getIntervencionesList()
					.getIntervencion()) {
				Integer tipoIntervencion = intervencion.getTipoIntervencion();
				MaestroIntervenciones maestroIntervenciones = this.maestroIntervencionesDao
						.find(new MaestroIntervenciones(tipoIntervencion.longValue()));
				if (null == maestroIntervenciones || null == maestroIntervenciones.getIdTipoIntervencion45()) {
					return RespuestasTelevidaEnum.TIPO_INTERVENCION_INCORRECTO.getRespuesta();
				}
			}
		}

		// Protocolos: sin validaciones al procesar

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesValoracion - Fin");
		return respuesta;

	}

	private Respuesta validarProcessAlarmas(List<AlarmaType> alarmas) {

		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// Alarmas
		for (AlarmaType alarma : alarmas) {

			Integer tipoAlarma = alarma.getTipoAlarma().getTipoAlarma();
			MaestroTipoAlarma maestroTipoAlarma = this.maestrotipoAlarmaDao
					.find(new MaestroTipoAlarma(tipoAlarma.longValue()));
			if (null == maestroTipoAlarma || null == maestroTipoAlarma.getIdTipoAlarma48()) {
				return RespuestasTelevidaEnum.TIPO_ALARMA_INCORRECTA.getRespuesta();
			}

			// llamada
			// Estos datos no nos los informan en Fase I así que no lo tratamos
			if (alarma.getTipoAlarma().getTipoAlarma() == Constantes.DOS) {
//				if (alarma.getTipoAlarma().getLlamada().getLlamadasRecibidas() != null) {
//
//					// tipoLlamadaRecibida: obligatorio. 1, 2 ó 3 (contra maestro AD74A55T00 excepto
//					// el 4)
//					LlamadasRecibidasType llamadasRecibidas = alarma.getTipoAlarma().getLlamada()
//							.getLlamadasRecibidas();
//					if (llamadasRecibidas.getTipoLlamadaRecibida() != null) {
//						// tipoLlamadaRecibida: contra maestro AD74A55T00 excepto 4
//						Integer tipoLlamada = llamadasRecibidas.getTipoLlamadaRecibida();
//						MaestroTipoLlamada maestroTipoLlamada = this.maestrotipoLlamadaDao
//								.find(new MaestroTipoLlamada(tipoLlamada.longValue()));
//						if ((null == maestroTipoLlamada || null == maestroTipoLlamada.getIdTipoLlamada55())
//								|| Constantes.CUATRO == llamadasRecibidas.getTipoLlamadaRecibida()) {
//							return RespuestasTelevidaEnum.TIPO_LLAMADA_INCORRECTA.getRespuesta();
//						}
//
//						// subTipoLlamadaRecibida: obligatorio (contra maestro AD74A56T00 con
//						// ID_TIPO_LLAMADA_56 = tipoLlamadaRecibida)
//						if (llamadasRecibidas.getSubTipoLlamadaRecibida() != null) {
//							maestroTipoLlamada = new MaestroTipoLlamada(tipoLlamada.longValue());
//							MaestroSubtpoLlamada maestroSubTipoLlamada = new MaestroSubtpoLlamada();
//							maestroSubTipoLlamada.setMaestroTipoLlamada(maestroTipoLlamada);
//							maestroSubTipoLlamada
//									.setIdSubtipoLlamada56(llamadasRecibidas.getSubTipoLlamadaRecibida().longValue());
//							maestroSubTipoLlamada = this.maestroSubtpoLlamadaDao.find(maestroSubTipoLlamada);
//							if (null == maestroSubTipoLlamada
//									|| null == maestroSubTipoLlamada.getIdSubtipoLlamada56()) {
//								return RespuestasTelevidaEnum.SUBTIPO_LLAMADA_RECIBIDA_INCORRECTO.getRespuesta();
//							}
//						} else {
//							return RespuestasTelevidaEnum.SUBTIPO_LLAMADA_RECIBIDA_OBLIGATORIO.getRespuesta();
//						}
//					}
//				}
//
//				if (alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas() != null) {
//
//					// • llamadaEmitidas: obligatorio si llamadasRecibidas no se informa (contra
//					// maestro AD74A56T00 con ID_TIPO_LLAMADA_56 = 4)
//					if (alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas() != null
//							&& alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas().equals(Constantes.CUATRO)) {
//						MaestroTipoLlamada maestroTipoLlamada = new MaestroTipoLlamada(Long.valueOf(Constantes.CUATRO));
//						MaestroSubtpoLlamada maestroSubTipoLlamada = new MaestroSubtpoLlamada();
//						maestroSubTipoLlamada.setMaestroTipoLlamada(maestroTipoLlamada);
//						maestroSubTipoLlamada.setIdSubtipoLlamada56(
//								alarma.getTipoAlarma().getLlamada().getLlamadasEmitidas().longValue());
//						maestroSubTipoLlamada = this.maestroSubtpoLlamadaDao.find(maestroSubTipoLlamada);
//						if (null == maestroSubTipoLlamada || null == maestroSubTipoLlamada.getIdSubtipoLlamada56()) {
//							return RespuestasTelevidaEnum.SUBTIPO_LLAMADA_EMITIDA_INCORRECTO.getRespuesta();
//						}
//					}
//				}
			}
		}

		return respuesta;
	}

	public Respuesta validarProccesValoracion(ValoracionType valoracion) throws Throwable {
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesValoracion - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// nivelSoporte: obligatorio. 1, 2, 3, 4, ó 5 (contra maestro AD74A58T00)
		// Lista de dispositivos (contra maestro AD74A35T00)
		// contratoActuacion

		// Nivel soporte
		Integer idNivelSoporte = valoracion.getNivelSoporte();
		MaestroNivSoporte maestroNivel = this.maestroNivSoporteDao
				.find(new MaestroNivSoporte(idNivelSoporte.longValue()));
		if (null == maestroNivel || null == maestroNivel.getIdNivelSoporte58()) {
			return RespuestasTelevidaEnum.NIVEL_SOPORTE_INCORRECTO.getRespuesta();
		}

		// dispositivosPropuestos
		if (valoracion.getDispositivosPropuestos() != null) {

			DispositivosPropuestos dispList = valoracion.getDispositivosPropuestos();
			for (DispositivoPropuestoType dispositivoPropuesto : dispList.getDispositivoPropuesto()) {
				if (!Utilidades.validarRango(Constantes.CERO, Constantes.UNO, dispositivoPropuesto.getAceptado())) {
					return RespuestasTelevidaEnum.DISPOSITIVO_INCORRECTO.getRespuesta();
				}

				Integer tipoDispositivo = dispositivoPropuesto.getTipo();
				Dispositivos dispositivo = this.dispositivosDao.find(new Dispositivos(tipoDispositivo.longValue()));
				if (null == dispositivo || null == dispositivo.getIdDispositivo35()) {
					return RespuestasTelevidaEnum.DISPOSITIVO_INCORRECTO.getRespuesta();
				}

			}
		}

//
//		// validamos que el fichero aportado esta en pif
//		if (null != comunicacion.getDatosValoracion().getValoracionInicial().getContratoActuacion()
//				&& null != comunicacion.getDatosValoracion().getValoracionInicial().getContratoActuacion()
//						.getEnlaceDocumento()) {
//			String enlaceDocumento = comunicacion.getDatosValoracion().getValoracionInicial().getContratoActuacion()
//					.getEnlaceDocumento();
//			if (UtilTelevida.validarCadena(enlaceDocumento)) {
//				// comprobar que el fichero existe
//				try {
//					HashMap<String, String> result = Ad74aPIFws.getInstance().infoDocument(enlaceDocumento);
//					String size = result.get("size");
//				} catch (Exception e) {
//					respuesta = RespuestasTelevidaEnum.DOCUMENTO_VALORACION_INCORRECTO.getRespuesta();
//					respuesta.setDescError(respuesta.getDescError() + " - " + e.getMessage());
//				}
//			} else {
//				ManagerErrors.manageError("La ruta del enlace no cumple el patron especificado: /ad74a/");
//			}
//		}
//

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesValoracion - Fin");
		return respuesta;

	}

	public Respuesta validarProccesCambioDomicilio(DatosInstalacionType datosInstalacionType) {
		// tipoTerminal: obligatorio. 1, 2, 3, 4 ó 5 (contra maestro AD74A34T00)
		// dispositivosList:
		// cada valor: 1, 2, 3, 4, 5, 6, 7 ó 8 (contra maestro AD74A35T00)

		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesAltaInst - Inicio");
		Respuesta respuesta = RespuestasTelevidaEnum.OK.getRespuesta();

		// Terminal contra maestro AD74A34T00
		// En FASE I del intercambio con PS este dato no se recibirá.
		// Se comenta su validación
//		if (null != datosInstalacionType) {
//			Integer terminal = datosInstalacionType.getTipoTerminal();
//			Terminales terminales = this.terminalesDao.find(new Terminales(terminal.longValue()));
//			if (null == terminales || null == terminales.getIdTerminal34()) {
//				respuesta = RespuestasTelevidaEnum.TERMINAL_INCORRECTO.getRespuesta();
//				return respuesta;
//			}
//		}
//		// Dispositivos
//		if (datosInstalacionType != null && datosInstalacionType.getDispositivosList() != null) {
//			DispositivosList dispList = datosInstalacionType.getDispositivosList();
//			for (Integer idDisp : dispList.getDispositivo()) {
//				Dispositivos dispositivos = this.dispositivosDao.find(new Dispositivos(idDisp.longValue()));
//				if (null == dispositivos || null == dispositivos.getIdDispositivo35()) {
//					respuesta = RespuestasTelevidaEnum.DISPOSITIVO_INCORRECTO.getRespuesta();
//					return respuesta;
//				}
//			}
//		}
		ValidacionesPrestador.logger.info("ValidacionesPrestador.validarProccesAltaInst - Fin");
		return respuesta;
	}

}
