package com.ejie.m62fb.service.registroVPP;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.stereotype.Service;
import com.ejie.m62fb.dao.registroVPP.AlojamientoDotacionalDao;
import com.ejie.m62fb.dao.registroVPP.ContratoAlquileradDao;
import com.ejie.m62fb.dao.registroVPP.InquilinoAdDao;
import com.ejie.m62fb.model.ContratoAlquilerad;
import com.ejie.m62fb.model.InquilinoAd;
import com.ejie.m62fb.model.importar.Feedback;
import com.ejie.m62fb.model.importar.FeedbackError;
import com.ejie.m62fb.model.jaxb.comunicacionAD.ComunicacionAlojamientosDotacionales;
import com.ejie.m62fb.model.jaxb.comunicacionAD.ComunicacionAlojamientosDotacionales.ContratosAlquiler.ContratoAlquiler;
import com.ejie.m62fb.model.jaxb.comunicacionAD.ComunicacionAlojamientosDotacionales.ContratosAlquiler.ContratoAlquiler.Titular;
import com.ejie.m62fb.model.persona.Persona;
import com.ejie.m62fb.utils.constants.AppConstantes;
import com.ejie.x38.util.DateTimeManager;

/**
 * CargaFicherosServiceImpl.
 * 
XXXX
 */
@Service(value = "cargaFicheroADService")
public class CargaFicheroADServiceImpl implements CargaFicheroADService {
	@Autowired
	private InquilinoAdDao inquilinoAdDao;
	@Autowired
	private CargaFicherosService cargaFicherosService;
	@Autowired
	ReloadableResourceBundleMessageSource  messageSource;
	@Autowired
	private ContratoAlquileradDao contratoAlquileradDao;
	@Autowired
	private AlojamientoDotacionalDao alojamientoDotacionalDao;
	
	
	//1-CARGA FICHERO 
	public List<Feedback> cargarFicheroComunicacionAloDot(ComunicacionAlojamientosDotacionales comunicacionAlojamiento,
			String numExpediente, Date fechaEntrada) throws ParseException {
		List<Feedback> listaErroresAvisos = validarContratosComunicacionAloDot(comunicacionAlojamiento,numExpediente);
		if (listaErroresAvisos.size()==0){
			insertarDatosComunicacionAloDot(comunicacionAlojamiento,numExpediente,fechaEntrada);
		}
		return listaErroresAvisos;
	}
	private List<Feedback> validarContratosComunicacionAloDot(ComunicacionAlojamientosDotacionales comunicacionAlojamiento,String numExpediente){
		Locale locale = LocaleContextHolder.getLocale();
		List<Feedback> listaErroresAvisos=new ArrayList<Feedback>();
		//INICIO CONTRATO ALQUILER
		validarContratoAlquiler(listaErroresAvisos,comunicacionAlojamiento.getContratosAlquiler().getContratoAlquiler(),numExpediente,locale);
		//FIN CONTRATO ALQUILER
		return listaErroresAvisos;
	}
	//1.2-VALIDAR CONTRATOS ALQUILER SOLICITUD DE CALIF PROVIS DEFINITIVA
	/**
	 * Validar Contrato de alquiler de 
	 * @param listaErroresAvisos
	 * @param contratos
	 * @param numExpediente
	 * @param locale
	 */
	private void validarContratoAlquiler(List<Feedback> listaErroresAvisos,List<ContratoAlquiler> contratos,String numExpediente,Locale locale){
		for (ContratoAlquiler contratoXML  : contratos) {
			//VALIDAR QUE EL ALOJAMIENTO DOTACIONAL EXISTA
			if(alojamientoDotacionalDao.findIdAlojReg(contratoXML.getNumVivienda(), numExpediente)==null){
				FeedbackError error = new FeedbackError();
				error.setHoja(AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER);
				error.setElemento(messageSource.getMessage("error.importar.xls.vivienda", null, locale));
				error.setDescripcion(messageSource.getMessage("error.importar.xls.vivienda.no.existe", 
						new Object[] {contratoXML.getNumVivienda(),numExpediente}, locale));
				listaErroresAvisos.add(error);
			}
			//VALIDAR CONTRATO ALQUILER
			cargaFicherosService.validarContratoAlquiler(listaErroresAvisos, contratoXML.getNumVivienda(), contratoXML.getFecInicioAlquiler(), contratoXML.getFecFinAlquiler(), locale);
			//VALIDAR TITULARES
			List<String> titulares=new ArrayList<String>();
			for (Titular 
					titular : contratoXML.getTitular()) {
				cargaFicherosService.validarDatosTitular(listaErroresAvisos,titulares, AppConstantes.NOM_HOJA_CONTRATOS_ALQUILER,
						contratoXML.getNumVivienda(), titular.getDNI(), titular.getNombre(), titular.getApellido1(), titular.getApellido2(), locale);
			}
		}
	}
	public void insertarDatosComunicacionAloDot(
			ComunicacionAlojamientosDotacionales comunicacionAlojamiento,
			String numExpediente,Date fechaEntradaContrato) throws ParseException{
		for (ContratoAlquiler contratoXML  : comunicacionAlojamiento.getContratosAlquiler().getContratoAlquiler()) {
			ContratoAlquilerad contratoAlquiler=new ContratoAlquilerad();
			//AlojamientoDotacional + GARAJE + TRASTERO
			//Alojamiento alojamiento= getDatosAlojamiento(comunicacionAlojamiento,contratoXML.getNumVivienda());
			
			//AlojamientoDotacional
			com.ejie.m62fb.model.AlojamientoDotacional alojamientoDotacional = new com.ejie.m62fb.model.AlojamientoDotacional(alojamientoDotacionalDao.findIdAlojReg(contratoXML.getNumVivienda(), numExpediente));
			contratoAlquiler.setAlojamientoDotacional(alojamientoDotacionalDao.find(alojamientoDotacional));
			//FEC_ENT_CONTRATO  -> Fecha entrada que se ha introducido al comienzo de la carga
			contratoAlquiler.setFecEntContrato(fechaEntradaContrato);
			//FEC_INICIO
			SimpleDateFormat format = contratoXML.getFecInicioAlquiler().length()>10?DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
			contratoAlquiler.setFecInicio(format.parse(contratoXML.getFecInicioAlquiler()));
			//FEC_ALQUILER
			format = contratoXML.getFecFinAlquiler().length()>10?DateTimeManager.getTimestampFormat(AppConstantes.ES_LOCALE):DateTimeManager.getDateTimeFormat(AppConstantes.ES_LOCALE);
			contratoAlquiler.setFecFin(format.parse(contratoXML.getFecFinAlquiler()));
			
			contratoAlquiler.setNumContrato(new Long(contratoAlquileradDao.findNumContratoMaxMasUno(alojamientoDotacional.getIdAlojReg())));
			contratoAlquileradDao.add(contratoAlquiler);
			//OBTENER EL CONTRATO DADO DE ALTA
			contratoAlquiler=contratoAlquileradDao.findAll(contratoAlquiler, null).get(0);
			
			for (Titular 
					titular : contratoXML.getTitular()) {
				InquilinoAd inquilino=new InquilinoAd();
				inquilino.setContratoAlquilerad(contratoAlquiler);
				inquilino.setAlojamientoDotacional(alojamientoDotacional);

				Persona persona=cargaFicherosService.addPersonaIfNoExists(titular.getDNI(),titular.getNombre(),titular.getApellido1(),titular.getApellido2());

				inquilino.setNumInquilino(contratoAlquiler.getNumContrato()); 
				inquilino.setPersona(persona);
				inquilinoAdDao.add(inquilino);
			}
		}
	}
}

	