package com.mx.dla.dda.factura.general.bos;

import java.io.IOException;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import com.mx.dla.dda.contrato.transaccion.exceptions.dtos.TransaccionException;
import com.mx.dla.dda.factura.general.daos.FacturacionDAO;
import com.mx.dla.dda.factura.general.dtos.EstudioConsultaDTO;
import com.mx.dla.dda.factura.general.dtos.FacturaGeneralDTO;
import com.mx.dla.dda.factura.general.dtos.ParamNotificaFacturaDTO;
import com.mx.dla.dda.factura.general.dtos.ResponseNotificarFacturaDTO;
import com.mx.dla.dda.factura.ws.dtos.DDA_I172334DTO;
import com.mx.dla.dda.factura.ws.dtos.DTFactura;
import com.mx.dla.dda.factura.ws.dtos.DTMovimientoFinalPO;
import com.mx.dla.dda.factura.ws.dtos.FacturaDTO;
import com.mx.dla.dda.general.constants.InterfazWSRespuesta;
import com.mx.dla.dda.general.dtos.ResponseDTO;
import com.mx.dla.dda.restClient.bos.DLARestClient;
import com.mx.dla.dda.restClient.bos.DLARestClientFactory;
import com.mx.dla.dda.restClient.constants.DLARestServices;
import com.mx.dla.global.bos.BaseBO;

@Component
public class FacturacionWServiceBO extends BaseBO {

	@Autowired
	public DLARestClientFactory dlaRestClientFactory;

	@Autowired
	private FacturacionDAO facturacionDAO;

	@Autowired
	private ConvertidordDto2Rest convertidor;

	@Value("${factura.detalle.isoMedida}")
	protected String isoMedida;

	public Integer notificaFacturaInterfaz(FacturaGeneralDTO facturaDTO) {
		Integer estatus = 0;
		String iso = facturacionDAO.consultaIsoMedida(isoMedida);
		iso = iso == null ? "" : iso;
		EstudioConsultaDTO estudio = facturacionDAO.consultaEstudio(facturaDTO.getIdEstudio());
		DTFactura message = convertidor.generaFacturaWS(facturaDTO, estudio.getDescEstudio(), estudio.getMoneda(), iso);

		try {
			logger.info("Rest FACTURA_NOTIFICA #14 {}", message.getFactura().getReferencia());

			DLARestClient client = dlaRestClientFactory.getClient(DLARestServices.FACTURA_NOTIFICA);
			FacturaDTO response = client.get(message, FacturaDTO.class);

			logger.info("Notificar Factura Respuesta {}", response.getEstatusDda());

			if (response != null && response.getEstatusDda() != null
					&& InterfazWSRespuesta.parse(response.getEstatusDda()).equals(InterfazWSRespuesta.OK)) {
				estatus = new Integer(InterfazWSRespuesta.OK.getValue());
				facturaDTO.setIdSapRegistro(response.getrFactura());
			} else
				estatus = new Integer(InterfazWSRespuesta.ERROR.getValue());

		} catch (IOException e) {
			logger.error("Error: " + e.getMessage());
			estatus = 0;
		} catch (TransaccionException e) {
			logger.error("Error: " + e.getMessage());
			estatus = 0;
		}
		return estatus;
	}

	public Integer enviaMovimientoFinal(String idSap) {
		DTMovimientoFinalPO message = convertidor.generaRegistro(idSap);
		Integer estatus = 0;

		try {
			logger.info("Servicio ENVIA_MOVIMIENTO_FINAL # 34.");
			logger.info("Solicitud {}", message.getRegistro().getNumDoc());

			DLARestClient client = dlaRestClientFactory.getClient(DLARestServices.ENVIA_MOVIMIENTO_FINAL);
			DDA_I172334DTO response = client.get(message, DDA_I172334DTO.class);

			logger.info("Respuesta {}", response.getEstatus_dda());

			if (response != null && response.getEstatus_dda() != null)
				estatus = InterfazWSRespuesta.parse(response.getEstatus_dda()).equals(InterfazWSRespuesta.OK)
						? new Integer(InterfazWSRespuesta.OK.getValue())
						: new Integer(InterfazWSRespuesta.ERROR.getValue());

		} catch (IOException e) {
			logger.error("Error: " + e.getMessage());
			estatus = 0;
		} catch (TransaccionException e) {
			logger.error("Error: " + e.getMessage());
			estatus = 0;
		}
		return estatus;
	}

	public ResponseDTO notificaFactura(FacturaGeneralDTO facturaDTO) {
		ResponseDTO respuesta = new ResponseDTO();
		respuesta.setCodigo(new Integer(InterfazWSRespuesta.OK.getValue()));
		respuesta.setMensaje(InterfazWSRespuesta.OK.getDesc());

		ParamNotificaFacturaDTO message = new ParamNotificaFacturaDTO();
		message.setIdFactura(facturaDTO.getIdFactura().toString());

		try {
			logger.info("Rest FACTURA_NOTIFICA #14 {}", message.getIdFactura());

			logger.info("Request servicio {}", message);

			DLARestClient client = dlaRestClientFactory.getClient(DLARestServices.FACTURA_NOTIFICA);
			ResponseNotificarFacturaDTO response = client.get(message, ResponseNotificarFacturaDTO.class);

			logger.info("Response servicio {}", response);

			if (response != null && response.getResultado()) {
				logger.info("Notificar Factura Respuesta {}", response.getMensaje());
				respuesta.setCodigo(new Integer(InterfazWSRespuesta.OK.getValue()));
				respuesta.setMensaje(InterfazWSRespuesta.OK.getDesc());
			} else {
				respuesta.setCodigo(new Integer(InterfazWSRespuesta.ERROR.getValue()));
				respuesta.setMensaje(response.getMensaje());
			}
		} catch (IOException e) {
			logger.error("Error: " + e.getMessage());
			respuesta.setCodigo(new Integer(InterfazWSRespuesta.ERROR.getValue()));
			respuesta.setMensaje(e.getMessage());
		} catch (TransaccionException e) {
			logger.error("Error: " + e.getMessage());
			respuesta.setCodigo(new Integer(InterfazWSRespuesta.ERROR.getValue()));
			respuesta.setMensaje(e.getMessage());
		}
		return respuesta;
	}

}
