package com.ejie.ad74a.process;

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

import com.ejie.ad74a.exception.BatchProcessException;
import com.ejie.ad74a.service.PruebaHumoService;
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.RespuestaType;
import com.ejie.ad74a.ws.client.televida.model.TipoOperacionEnum;
import com.ejie.ad74a.ws.client.televida.service.LiquidacionWS;

/**
 * Proceso para realizar pruebas de ejecucion de codigo.
 */
@Component(value = "pruebaProcess")
public class PruebaHumoProcess implements IProcess {

	private static final Logger logger = LoggerFactory.getLogger(PruebaHumoProcess.class);
	
	@Autowired
	PruebaHumoService pruebaService;
	
	@Autowired
	LiquidacionWS liqWs;
	

	/*
	 * (non-Javadoc)
	 * 
	 * @see com.ejie.ad74a.process.IProcess#execute(java.lang.String[])
	 */
	@Override
	public void execute(String... args) throws BatchProcessException {
		logger.info("Entra a ejecutarse el proceso de prueba");
		
		if ("BD".equalsIgnoreCase(UtilProperties.Props.PRUEBA_HUMO.val())){
			logger.info("Prueba humo BD");
			this.pruebaHumoBd();
		} else if ("WS".equalsIgnoreCase(UtilProperties.Props.PRUEBA_HUMO.val())) {
			logger.info("Prueba humo WS");
			this.pruebaHumoWS();
		} else if ("OT".equalsIgnoreCase(UtilProperties.Props.PRUEBA_HUMO.val())){
			logger.info("Prueba humo OT");
			this.pruebaHumoOt();
		} else {
			logger.error("Prueba humo no configurada correctamente");
		}
	}

	/**
	 * Prueba de humo usando WS
	 */
	private void pruebaHumoWS() {
		try {
			Comunicacion comunicacion = new Comunicacion();
			comunicacion.setCabecera(getCabecera());
			comunicacion.setDatosEmision(getDatosEmision());
			
			RespuestaType resp = liqWs.emitirLiquidacion(comunicacion);
			logger.info("Repuesta {} - {}",resp.getCodRespuesta(), resp.getMensaje());
		} catch (Exception e) {
			logger.error("Error:", e);
		}
	}
	
	/**
	 * Prueba de humo usando la bd
	 */
	private void pruebaHumoBd() {
	
		Long count = pruebaService.countSolicitantes();
		logger.info("Hay {} solicitantes", count);
	}
	
	private DatosEmisionType getDatosEmision() {

		DatosEmisionType datosEmision = new DatosEmisionType();
		datosEmision.setTipoIngreso("TLCOP");
		datosEmision.setOrigen("11223344");
		datosEmision.setEjercicio(2024);

		ConceptoType conceptoType = new ConceptoType();
		conceptoType.setIdConcepto(2);
		conceptoType.setImporte(400);
		Conceptos conceptos = new Conceptos();
		conceptos.getConcepto().add(conceptoType);
		datosEmision.setConceptos(conceptos);

		datosEmision.setFLimitePago("20/06/2024");
		datosEmision.setExpediente("TL_TEST_1");
		datosEmision.setConcepto("concepto");
		datosEmision.setTerritorio(1);

		DatosIdentificacionType datosIdentificacionType = new DatosIdentificacionType();
		datosIdentificacionType.setTipoIdentificador(2);
		datosIdentificacionType.setIdentificador("96131011G");
		datosIdentificacionType.setNombre("ALBERTO");
		datosIdentificacionType.setApellido1("PRUEBA");
		datosIdentificacionType.setApellido2("PRUEBA");
		datosEmision.setDatosIdentificacion(datosIdentificacionType);

		DatosDireccionType datosDireccionType = new DatosDireccionType();
		datosDireccionType.setResidente(1);
		datosDireccionType.setProvincia("01");
		datosDireccionType.setMunicipio("051");
		datosDireccionType.setCodLocalidad(Long.valueOf("10105100000073"));
		datosDireccionType.setLocalidad("Agurain - Salvatierra");
		datosDireccionType.setTipoVia("CL");
		datosDireccionType.setCalle("Alangua");
		datosDireccionType.setPortal("1");
		datosDireccionType.setLetra("C");
		datosDireccionType.setPiso("2");
		datosDireccionType.setCodigoPostal("01200");
		datosEmision.setDatosDireccion(datosDireccionType);

		DatosBancariosType datosBancariosType = new DatosBancariosType();
		datosBancariosType.setDomiciliacion(0);
		datosEmision.setDatosBancarios(datosBancariosType);

		return datosEmision;
	}

	private CabeceraType getCabecera() {
		CabeceraType cabecera = new CabeceraType();
		cabecera.setTipoOperacion(TipoOperacionEnum.EMITIR);
		cabecera.setUsuario("AD74A");
		cabecera.setFComunicacion("10/06/2024");

		return cabecera;
	}
	
	/**
	 * Prueba de humo para otras pruebas
	 */
	private void pruebaHumoOt() {
	
		String cuenta = "";
		cuenta = "0232 1680 6136 9148 5105"; //cuenta ok, iban nok
		cuenta = "ES79 0232 1680 61 3691485105"; // iban on
		cuenta = "0205 8545 5955 29849674"; // cuenta ok, iban nok
		cuenta = "ES82 0205 8545 59 5529849674"; // iban ok
		cuenta = "ES82 0205 8545 59 5529849675"; // iban nok		
		logger.info("Cuenta {}", cuenta);
		logger.info("  - Válida {}", UtilLiquidaciones.isValidIban(cuenta));
		logger.info("  - Formateada {}", UtilLiquidaciones.formatearIBAN(cuenta));
		logger.info("  - Válida formateada {}", UtilLiquidaciones.isValidIban(UtilLiquidaciones.formatearIBAN(cuenta)));		
		
	}

}
