package com.ejie.ab61.tramita.adapter;

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

import com.ejie.ab61.clientesWS.pid.W43DfDocument;
import com.ejie.ab61.clientesWS.pid.W43DfGETDocument;
import com.ejie.ab61.clientesWS.pid.W43DfWSFault;
import com.ejie.ab61.exceptions.PidException;
import com.ejie.ab61.model.documento.Documento;
import com.ejie.ab61.tramita.helper.PidHelper;
import com.ejie.ab61.tramita.services.PidService;
import com.ejie.ab61.tramita.services.PidServiceImpl;
import com.ejie.ab61.tramita.transformer.PidTransformer;

/**
 * PidAdapterServiceImpl Adaptador con el PID del sistema
 *
 *  
 */
@Service(value = "PidAdapterServiceImpl")
public class PidAdapterServiceImpl implements PidAdapterService {

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

	@Autowired()
	private PidService pidService;

	/**
	 * Constructor
	 */
	public PidAdapterServiceImpl() {
		super();
	}

	/**
	 * recuperarDocumento Recupera el documento del PID
	 * 
	 * @param documento
	 *            Documento
	 * @return Documento
	 */
	@Override
	public Documento recuperarDocumento(Documento documento) {
		PidAdapterServiceImpl.logger.info("recuperarDocumento - Inicio");
		try {
			W43DfGETDocument getDocument = PidHelper.crearW43DfGetDocument(documento);

			W43DfDocument resultadoWS = pidService.getDocument(getDocument);

			Documento resultado = PidTransformer.transformRecuperarDocumento(resultadoWS);
			logger.debug("recuperarDocumento - Return: " + resultado);
			return resultado;
		} catch (W43DfWSFault eFault) {
			throw new PidException(eFault.getMessage());
		} catch (Exception excep) {
			throw new PidException(excep.getMessage());
		} finally {
			PidAdapterServiceImpl.logger.info("recuperarDocumento - Final");
		}
	}

	/**
	 * insertarDocumento Inserta un documento y devuelve el identificador del
	 * documento en el PID
	 * 
	 * @param documento
	 *            Documento
	 * @return String Id del documento insertado
	 */
	@Override
	public String insertarDocumento(Documento documento) {
		PidAdapterServiceImpl.logger.info("insertarDocumento - Inicio");
		try {
			W43DfDocument newDocument = PidHelper.crearW43DfDocument(documento);

			String resultadoWS = pidService.addDocument(newDocument);

			String resultado = PidTransformer.transformInsertarDocumento(resultadoWS);
			logger.debug("insertarDocumento - Return: " + resultado);
			return resultado;
		} catch (W43DfWSFault eFault) {
			throw new PidException(eFault.getMessage());
		} catch (Exception excep) {
			throw new PidException(excep.getMessage());
		} finally {
			PidAdapterServiceImpl.logger.info("insertoDocumento - Final");
		}
	}

	/**
	 * modificarDocumento Modifica un documento en el PID
	 * 
	 * @param documento
	 *            Documento
	 */
	@Override
	public void modificarDocumento(Documento documento) {
		PidAdapterServiceImpl.logger.info("modificarDocumento - Inicio");
		try {
			W43DfDocument newDocument = PidHelper.crearW43DfDocument(documento);

			pidService.modifyDocument(newDocument);
			logger.debug("modificarDocmento - OK");
		} catch (W43DfWSFault eFault) {
			throw new PidException(eFault.getMessage());
		} catch (Exception excep) {
			throw new PidException(excep.getMessage());
		} finally {
			PidAdapterServiceImpl.logger.info("modificarDocumento - Final");
		}
	}

	/**
	 * eliminarDocumento Elimina un documentl en el PID
	 * 
	 * @param idDocumento
	 *            String
	 */
	@Override
	public void eliminarDocumento(String idDocumento) {
		PidAdapterServiceImpl.logger.info("eliminarDocumento - Inicio");
		try {
			pidService.deleteDocument(idDocumento);
			logger.debug("eliminarDocumento - OK");
		} catch (W43DfWSFault eFault) {
			throw new PidException(eFault.getMessage());
		} catch (Exception excep) {
			throw new PidException(excep.getMessage());
		} finally {
			PidAdapterServiceImpl.logger.info("eliminarDocumento - Final");
		}
	}
}
