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

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

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ad74a.exceptions.ManagerErrors;
import com.ejie.ad74a.model.Avisos;
import com.ejie.ad74a.model.Contactos;
import com.ejie.ad74a.model.DispValoraciones;
import com.ejie.ad74a.model.Dispositivos;
import com.ejie.ad74a.model.DispositivosSol;
import com.ejie.ad74a.model.ErroresTelevida;
import com.ejie.ad74a.model.Expedientes;
import com.ejie.ad74a.model.MaestroActores;
import com.ejie.ad74a.model.MaestroSubtiposAviso;
import com.ejie.ad74a.model.MaestroTiposAviso;
import com.ejie.ad74a.model.Solicitantes;
import com.ejie.ad74a.model.Valoraciones;
import com.ejie.ad74a.util.comun.Utilidades;
import com.ejie.ad74a.util.comun.UtilidadesFecha;
import com.ejie.ad74a.util.constantes.ActoresEnum;
import com.ejie.ad74a.util.constantes.Constantes;
import com.ejie.ad74a.util.constantes.ProcedimientosEnum;
import com.ejie.ad74a.util.constantes.SubTipoAvisoEnum;
import com.ejie.ad74a.util.constantes.TipoAvisoEnum;
import com.ejie.ad74a.util.constantes.TipoIdentificadorEnum;
import com.ejie.ad74a.util.constantes.modelos.TipoContacto;
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.DispositivoPropuestoType;
import com.ejie.ad74a.ws.server.televida.model.ValoracionType;

public final class ModelApplicationParser {

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

	private ModelApplicationParser() {
	}

	public static ErroresTelevida getComunicationToError(Comunicacion comunicacion) {
		ErroresTelevida error = new ErroresTelevida();
		error.setEstado51(Constantes.EstadoErrores.ESTADO_ERRONEO);
		error.setFecrecep51(new Date());
		error.setTipomensaje51(comunicacion.getCabecera().getTipoComunicacion().toString());
		// mensajeErrorJms.setMensaje00((String) mapaMensaje.get("mensajeTexto"));
//		error.setTipomensaje50((String) mapaMensaje.get("EventWhat"));
//		mensajeErrorJms.setIdjms50((String) mapaMensaje.get("jmsid"));
//		mensajeErrorJms.setProcedure50((String) mapaMensaje.get("ProcedureID"));
//		mensajeErrorJms.setFecrecep50(new Date());
//		mensajeErrorJms.setEstado50(Constantes.EstadoErrores.ESTADO_ERRONEO);
		return error;
	}

	public static Avisos getAvisoBajaInst(Solicitantes solicitante, String observaciones) {
		Avisos aviso = new Avisos();
		MaestroActores origen = new MaestroActores();
		origen.setIdActor42(ActoresEnum.PS.getId());
		aviso.setMaestroActoresByOrigen20(origen);
		MaestroActores destino = new MaestroActores();
		destino.setIdActor42(ActoresEnum.DSS.getId());
		aviso.setMaestroActoresByDestino20(destino);
		aviso.setObservaciones20(observaciones);
		MaestroTiposAviso tipoAviso = new MaestroTiposAviso();
		tipoAviso.setIdTipoAviso40(TipoAvisoEnum.ACTUAL.getIdLongValue());
		aviso.setMaestroTiposAviso(tipoAviso);
		MaestroSubtiposAviso subtipoAviso = new MaestroSubtiposAviso();
		subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.BAJA.getIdLongValue());
		aviso.setMaestroSubtiposAviso(subtipoAviso);
		aviso.setIdSolicitante20(solicitante.getIdSolicitante01());
		aviso.setUsuAlta20(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
		return aviso;
	}

	public static Avisos getAvisoQueja(Solicitantes solicitante, String observaciones, int motivoQueja) {
		Avisos aviso = new Avisos();
		MaestroActores origen = new MaestroActores();
		aviso.setIdAviso20(TipoAvisoEnum.QUEJREC.getIdLongValue());

		origen.setIdActor42(ActoresEnum.PS.getId());
		aviso.setMaestroActoresByOrigen20(origen);
		MaestroActores destino = new MaestroActores();
		destino.setIdActor42(ActoresEnum.DSS.getId());
		aviso.setMaestroActoresByDestino20(destino);
		aviso.setObservaciones20(observaciones);

		MaestroSubtiposAviso subtipoAviso = new MaestroSubtiposAviso();
		if (motivoQueja == Constantes.CINCO) {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.INSTAL.getIdLongValue());
		} else if (motivoQueja == Constantes.UNO || motivoQueja == Constantes.DOS || motivoQueja == Constantes.TRES
				|| motivoQueja == Constantes.CUATRO || motivoQueja == Constantes.SEIS
				|| motivoQueja == Constantes.SIETE) {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.SERV.getIdLongValue());
		} else if (motivoQueja == Constantes.OCHO) {
			subtipoAviso.setIdSubTipoAviso41(SubTipoAvisoEnum.OTRASQUEJ.getIdLongValue());
		}
		aviso.setMaestroSubtiposAviso(subtipoAviso);
		aviso.setIdSolicitante20(solicitante.getIdSolicitante01());
		aviso.setUsuAlta20(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
		return aviso;
	}

	public static Expedientes getExpedienteBaja(Comunicacion comunicacion) {
		Expedientes expediente = new Expedientes();
		Solicitantes solicitante = getBeneficiarioComunicacion(comunicacion);
		expediente.setSolicitantes(solicitante);
		expediente.setIdMotivoBaja00(Long.valueOf(comunicacion.getDatosBajaBeneficiario().getMotivoBaja()));
		expediente.setIdProcedimiento00(ProcedimientosEnum.BAJA.getId());

		return expediente;
	}

	public static Solicitantes getBeneficiarioComunicacion(Comunicacion comunicacion) {
		Solicitantes solicitante = new Solicitantes();
//		if (null != comunicacion && null != comunicacion.getCabecera()
//				&& null != comunicacion.getCabecera().getBeneficiario()) {
//			solicitante.setApellido101(comunicacion.getCabecera().getBeneficiario().getApe1());
//			solicitante.setApellido201(comunicacion.getCabecera().getBeneficiario().getApe2());
//			solicitante.setNombre01(comunicacion.getCabecera().getBeneficiario().getNombre());
//			solicitante.setIdentificador01(comunicacion.getCabecera().getBeneficiario().getNumDocumento());
//			solicitante.setTipoIdentificador01(
//					String.valueOf(comunicacion.getCabecera().getBeneficiario().getTipoDocumento()));
//		} else {
//			ManagerErrors.manageError("No datos del beneficiario");
//		}

		if (null != comunicacion && null != comunicacion.getCabecera()
				&& null != comunicacion.getCabecera().getNumAbonado()) {
			solicitante.setNumAbonado01(comunicacion.getCabecera().getNumAbonado());
		} else {
			ManagerErrors.manageError("No datos del beneficiario");
		}

		return solicitante;
	}

	public static Contactos getContactoUpdate(ContactoType contactoTV, Long idSolicitante) {
		Contactos contacto = new Contactos();
		if (null != contactoTV && null != idSolicitante) {
			contacto.setApellido103(contactoTV.getApe1());
			contacto.setApellido203(contactoTV.getApe2());
			contacto.setIdentificador03(contactoTV.getNumDocumento());
			contacto.setNombre03(contactoTV.getNombre());
			contacto.setPoseeLlaves03(contactoTV.getPoseeLlaves());
			contacto.setTipoIdentificador03(TipoIdentificadorEnum.DNI.getId());
			contacto.setTlfno03(contactoTV.getTlf1());
			contacto.setTlfno203(contactoTV.getTlf2());
			contacto.setTlfno303(contactoTV.getTlf3());
			contacto.setIdSolicitante03(idSolicitante);
			contacto.setContactoInst03(contactoTV.getEsContactoInstalacion());
			contacto.setTipoContacto03(TipoContacto.tipoContacto03.FISICA.getId());
			contacto.setUsuAlta03(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);

		} else {
			ManagerErrors.manageError("No hay datos del contacto");
		}
		return contacto;
	}

	public static List<DispositivosSol> getDispositivosInstAlta(DatosInstalacionType datosInstalacion,
			Long idSolicitante) {
		List<DispositivosSol> listDispositivos = new ArrayList<DispositivosSol>();
		DispositivosSol dispositivosSol = new DispositivosSol();
		// TODO campo aceptado y fInstalacion¿?¿?
		if (null != datosInstalacion && null != idSolicitante) {
//			AD74A23T00.F_INSTALACION_23 = el obtenido a partir de los datos de la cabecera
//			AD74A23T00.ID_SOLICITANTE_23 = el obtenido a partir de los datos de la cabecera
//			AD74A23T00.ID_TERMINAL_23 = datosInstalacion.tipoTerminal

//			if (!Utilidades.esNulo(datosInstalacion.getTipoTerminal())) {
//				dispositivosSol = new DispositivosSol();
//				dispositivosSol.setIdTerminal23(Long.valueOf(datosInstalacion.getTipoTerminal()));
//				dispositivosSol.setIdSolicitante23(idSolicitante);
//				dispositivosSol
//						.setfInstalacion23(UtilidadesFecha.parsearFechaTelevida(datosInstalacion.getFInstalacion()));
//				dispositivosSol.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
//				listDispositivos.add(dispositivosSol);
//			}
			if (null != datosInstalacion.getDispositivosList()
					&& datosInstalacion.getDispositivosList().getDispositivo().size() > 0) {

//				AD74A23T00.F_INSTALACION_23 = el obtenido a partir de los datos de la cabecera
//				AD74A23T00.ID_SOLICITANTE_23 = el obtenido a partir de los datos de la cabecera
//				AD74A23T00.ID_TERMINAL_23 = datosInstalacion.tipoTerminal

				for (Integer idDispositivo : datosInstalacion.getDispositivosList().getDispositivo()) {
					dispositivosSol = new DispositivosSol();
					dispositivosSol.setIdDispositivo23(idDispositivo.longValue());
					dispositivosSol.setIdSolicitante23(idSolicitante);
//					dispositivosSol.setfInstalacion23(
//							UtilidadesFecha.parsearFechaTelevida(datosInstalacion.getFInstalacion()));
					try {
						dispositivosSol.setfInstalacion23(UtilidadesFecha.formatearStringToDateFormato(
								datosInstalacion.getFInstalacion(), Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
					} catch (ParseException e) {
						e.printStackTrace();
					}
					dispositivosSol.setUsuAlta23(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
					listDispositivos.add(dispositivosSol);
				}
			}

		} else {
			ManagerErrors.manageError("No hay datos de la instalacion");
		}

		return listDispositivos;
	}

	public static Valoraciones getValoracion(ValoracionType datosValoracion, Long idSolicitante, String oid) {
		Valoraciones valoracion = new Valoraciones();
		if (null != datosValoracion) {
			valoracion.setAltoRiesgo08(datosValoracion.getAltoRiesgo());
			valoracion.setContratoActuacion08(oid);
			valoracion.setNivelMaltrato08(datosValoracion.getNivelRiesgoMaltrato());
			valoracion.setMotivoRetraso08(datosValoracion.getMotivosRetrasoRevaloracion());
			valoracion.setModoValoracion08(datosValoracion.getModoValoracion());

			// valoracion.setNivelSuicidio08(datosValoracion.getNivelRiesgoSuicidio());

			if (datosValoracion.getNivelSoporte() != 0) {
				valoracion.setIdNivelSoporte08(Long.valueOf(datosValoracion.getNivelSoporte()));
			}

			valoracion.setTipoValoracion08(datosValoracion.getTipoValoracion());
			if (!Utilidades.esBlancoNulo(datosValoracion.getFValoracion())) {
//				valoracion.setfValoracion08(UtilidadesFecha.parsearFechaTelevida(datosValoracion.getFValoracion()));
				try {
					valoracion.setfValoracion08(UtilidadesFecha.formatearStringToDateFormato(
							datosValoracion.getFValoracion(), Constantes.DATE_FORMAT_TIMESTAMP_MASK_DEFAULT));
				} catch (ParseException e) {
					e.printStackTrace();
				}
			}

			valoracion.setIdSolicitante08(idSolicitante);
			valoracion.setUsuAlta08(com.ejie.ad74a.constantes.Constantes.USER_WS_TELEVIDA);
		} else {
			ManagerErrors.manageError("No hay datos de valoracion");
		}

		return valoracion;
	}

	public static List<DispValoraciones> getDispositivosValoracion(List<DispositivoPropuestoType> tiposDispositivoList,
			Valoraciones valoracion) {
		List<DispValoraciones> listaDispositivos = new ArrayList<DispValoraciones>();
		if (null != tiposDispositivoList && !tiposDispositivoList.isEmpty()) {
			DispValoraciones dispositivo = null;
			for (DispositivoPropuestoType tipoDispositivo : tiposDispositivoList) {
				dispositivo = new DispValoraciones();

				if (null != tipoDispositivo.getTipo()) {
					dispositivo.setDispositivos(new Dispositivos(tipoDispositivo.getTipo().longValue()));
				} else {
					ManagerErrors.manageError("El tipo de dispositivo no es correcto");
				}
				dispositivo.setValoraciones(valoracion);
				dispositivo.setAceptado09(tipoDispositivo.getAceptado());
				listaDispositivos.add(dispositivo);
			}

		} else {
			ManagerErrors.manageError("No hay datos de dispositivos de valoración");
		}

		return listaDispositivos;
	}

}
