/**
 * 
 */
package com.ejie.ad74a.util.mappers;

import java.math.BigDecimal;
import java.time.LocalDate;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ad74a.model.Ayuntamiento;
import com.ejie.ad74a.model.FacturacionAyuntamiento;
import com.ejie.ad74a.model.TipoIngreso;
import com.ejie.ad74a.util.UtilDates;
import com.ejie.ad74a.util.UtilLiquidaciones;
import com.ejie.ad74a.util.UtilProperties;
import com.ejie.ad74a.ws.client.televida.model.CabeceraType;
import com.ejie.ad74a.ws.client.televida.model.Comunicacion;
import com.ejie.ad74a.ws.client.televida.model.ConceptoType;
import com.ejie.ad74a.ws.client.televida.model.DatosBancariosType;
import com.ejie.ad74a.ws.client.televida.model.DatosDireccionType;
import com.ejie.ad74a.ws.client.televida.model.DatosEmisionType;
import com.ejie.ad74a.ws.client.televida.model.DatosEmisionType.Conceptos;
import com.ejie.ad74a.ws.client.televida.model.DatosIdentificacionType;
import com.ejie.ad74a.ws.client.televida.model.TipoOperacionEnum;

/**
 * Mapper Comunicacion
 * @author BICUGUAL
 *
 */
public class ComunicacionMapper {

	private static final Logger logger = LoggerFactory.getLogger(ComunicacionMapper.class);
	
	private int diasLimPag;
	
	public static ComunicacionMapper getInstace(int diasLimPag) {
		return new ComunicacionMapper(diasLimPag);
	}

	public ComunicacionMapper(int diasLimPag) {
		super();
		this.diasLimPag = diasLimPag;
	}

	public Comunicacion facturacionAytoToComunicacion(FacturacionAyuntamiento factura, Ayuntamiento ayto, boolean relanzamiento) {
		
		Comunicacion comunicacion= new Comunicacion();		
		CabeceraType cabecera = new CabeceraType();
		//Año de sistema
		Integer ejercicio = LocalDate.now().getYear();
		//Fecha de sistema
		String fComunicacion = UtilDates.formatDateToString(UtilDates.getFechaSistema());
		
		cabecera.setTipoOperacion(TipoOperacionEnum.EMITIR);
		cabecera.setUsuario(UtilProperties.Props.USER_PROCESS.val());
		cabecera.setFComunicacion(fComunicacion);
		
		DatosEmisionType dEmision = new DatosEmisionType();
		dEmision.setTipoIngreso(TipoIngreso.TLAYT.name());
		dEmision.setOrigen(factura.getIdFacturacion().toString());
		dEmision.setEjercicio(ejercicio);
		
		Conceptos conceptos = new Conceptos();
		ConceptoType concepto = new ConceptoType();
		concepto.setIdConcepto(3);
		concepto.setImporte(factura.getImporteFacturado().multiply(new BigDecimal(100)).intValue());
		concepto.setCodSubv(null);
		concepto.setNumDocFinan(null);
		concepto.setCodCausa(null);
		concepto.setFReintegro(null);
		conceptos.getConcepto().add(concepto);
		dEmision.setConceptos(conceptos);
		
		//dEmision.setFLimitePago(UtilDates.formatLocalDateToString(LocalDate.now().plusDays(diasLimPag)));
		dEmision.setFLimitePago(null);//Debe ir vacía
		dEmision.setExpediente(factura.getReferenciaRecibo());
		dEmision.setConcepto("Teleasistencia "+ UtilDates.formatNMesToUpperCaseText(factura.getMesDesde()) + " - " + UtilDates.formatNMesToUpperCaseText(factura.getMesHasta()) + " " + factura.getAnyoHasta().toString());
		dEmision.setTerritorio(UtilLiquidaciones.getIdTerritorio(ayto.getIdProvincia()));
		
		DatosIdentificacionType dIdent = new DatosIdentificacionType();
		dIdent.setTipoIdentificador(1);
		dIdent.setIdentificador(ayto.getCif());
		dIdent.setNombre(null != ayto.getDescEs() ? StringUtils.substring(ayto.getDescEs(), 0, 40): null);
		dIdent.setApellido1(null);
		dIdent.setApellido2(null);
		dEmision.setDatosIdentificacion(dIdent);
				
		DatosDireccionType dDirec = new DatosDireccionType();
		dDirec.setPais(null);
		dDirec.setResidente(1);
		dDirec.setProvincia(ayto.getIdProvincia());
		dDirec.setMunicipio(ayto.getIdMunicipio());
		dDirec.setCodLocalidad(0);
		dDirec.setTipoVia(null);
		dDirec.setLocalidad(null);
		dDirec.setCalle(null != ayto.getDireccion() ? StringUtils.substring(ayto.getDireccion(), 0, 25): null);
		dDirec.setPortal(null);
		dDirec.setLetra(null);
		dDirec.setEscalera(null);
		dDirec.setPiso(null);
		dDirec.setPuerta(null);
		dDirec.setCodigoPostal(ayto.getCp());
		dEmision.setDatosDireccion(dDirec);
		
		DatosBancariosType dBanc = new DatosBancariosType();

		if (Integer.valueOf(2).compareTo(ayto.getFormaPago())==0) {
			dBanc.setDomiciliacion(1);
			dBanc.setIban(ayto.getNumCuenta());
			dBanc.setFMandato(UtilDates.formatDateToString(ayto.getfAutorizacion()));			
		}else {
			dBanc.setDomiciliacion(0);
			dBanc.setBic(null);
			dBanc.setMandato(null);
		}
		
		dEmision.setDatosBancarios(dBanc);
		comunicacion.setCabecera(cabecera);
		comunicacion.setDatosEmision(dEmision);
		
		logger.debug("Comunicacion: {}", comunicacion);
		
		return comunicacion;
	}
	
}
