/**
 * 
 */
package com.ejie.ab61.tramita.adapter;

import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.List;

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

import com.ejie.ab61.comun.Constantes;
import com.ejie.ab61.comun.utilidades.XlnetsUtils;
import com.ejie.ab61.exceptions.PifException;
import com.ejie.ab61.tramita.services.PifService;
import com.ejie.y31.exception.Y31JanoServiceFileNotFoundException;
import com.ejie.y31.vo.Y31AttachmentBean;

/**
 *  
 * 
 */
@Service(value = "PifAdapterServiceImpl")
public class PifAdapterServiceImpl implements PifAdapterService {

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

	@Autowired
	public PifService pifService;

	/**
	 * Clase que adaptara los servicios de PIF a nuestro sistema
	 */
	private PifAdapterServiceImpl() {
		super();
	}

	/**
	 * Subir documento a PIF
	 * 
	 * @param file
	 *            Fichero que se va a subir al PIF
	 * @param fileName
	 *            Nombre del fichero
	 * @return
	 * @throws NumberFormatException
	 * @throws PifException
	 */
	public Y31AttachmentBean putFile(InputStream file, String fileName, String ruta, boolean preserveName)
			throws NumberFormatException, PifException {

		PifAdapterServiceImpl.logger.info("INICIO putFile");
		PifAdapterServiceImpl.logger.info("Parammetro de entrada fileName = " + fileName);
		PifAdapterServiceImpl.logger.info("Parammetro de entrada Ruta = " + ruta);

		String pathTo = ruta + fileName;

		XlnetsUtils.getInstance();
		Y31AttachmentBean y31AttachmentBeanResult = new Y31AttachmentBean();
		try {
			y31AttachmentBeanResult = this.pifService.putFile(XlnetsUtils.getTokenAplicacionDocument(), file, pathTo,
					preserveName, Long.valueOf(Constantes.PIF_TIEMPO_EXISTENCIA));
		} catch (PifException pif_e) {

			PifAdapterServiceImpl.logger.info("error putFile = " + pif_e.getMessage());

			throw pif_e;
		}
		return y31AttachmentBeanResult;
	}

	/**
	 * Subir documento a PIF con una persistencia determinada
	 * 
	 * @param file
	 *            InputStream: Fichero que se va a subir al PIF
	 * @param fileName
	 *            String: Nombre del fichero
	 * @param seconds
	 *            Long
	 * 
	 * @return String
	 * 
	 * @throws NumberFormatException
	 *             NumberFormatException
	 * @throws PifException
	 *             PifException
	 */
	public String putFileSeconds(InputStream file, String fileName, Long seconds)
			throws NumberFormatException, PifException {
		PifAdapterServiceImpl.logger.info("putFileSeconds - INICIO ");

		String pathTo = "/" + Constantes.CODIGO_APLICACION.toLowerCase() + "/" + fileName;
		XlnetsUtils.getInstance();
		Y31AttachmentBean y31AttachmentBeanResult = this.pifService
				.putFile(XlnetsUtils.getInstance().getTokenAplicacionDocument(), file, pathTo, true, seconds);
		return y31AttachmentBeanResult.getFilePath();
	}

	/**
	 * Obtener documento a PIF
	 * 
	 * @param file
	 *            Fichero que se va a subir al PIF
	 * @param fileName
	 *            Nombre del fichero
	 * @return
	 * @throws NumberFormatException
	 * @throws PifException
	 */
	public BufferedInputStream getFile(String pathFrom) throws NumberFormatException, PifException {

		XlnetsUtils.getInstance();
		return (BufferedInputStream) this.pifService.getFile(XlnetsUtils.getTokenAplicacionDocument(), pathFrom);

	}

	/**
	 * 
	 * @param sSessionToken
	 *            Sesi�n de aplicaci�n que est� escribiendo en el repositorio
	 * @param pathFrom
	 *            Ruta l�gica desde donde se va a mover el fichero. Incluir�
	 *            como carpeta principal la aplicaci�n origen
	 * @param fileName
	 *            Nombre del fichero
	 * @param preserveName
	 *            Indica si se desea preservar el nombre del fichero en la ruta
	 *            seleccionada sobrescribiendo el fichero si existiera. Si se
	 *            decide no preservar los nombres lo que se hace es concatenarle
	 *            una serie de d�gitos que lo hace �nico en el repositorio
	 * @return Y31AttachmentBean Y31AttachmentBean
	 * @throws PifException
	 */
	public Y31AttachmentBean moveFile(String pathFrom, String pathTo, boolean preserveName) throws PifException {

		XlnetsUtils.getInstance();
		return this.pifService.moveFile(XlnetsUtils.getTokenAplicacionDocument(), pathFrom, pathTo, preserveName);

	}

	/**
	 * 
	 * @param sSessionToken
	 *            Sesi�n de aplicaci�n que est� escribiendo en el repositorio
	 * @param pathFrom
	 *            Ruta l�gica desde donde se va a mover el fichero. Incluir�
	 *            como carpeta principal la aplicaci�n origen
	 * @param pathTo
	 *            Ruta l�gica donde se va a mover el fichero. Incluir� como
	 *            carpeta principal la aplicaci�n destino
	 * @param preserveName
	 *            Indica si se desea preservar el nombre del fichero en la ruta
	 *            seleccionada sobrescribiendo el fichero si existiera. Si se
	 *            decide no preservar los nombres lo que se hace es concatenarle
	 *            una serie de d�gitos que lo hace �nico en el repositorio
	 * @return Y31AttachmentBean Y31AttachmentBean
	 * @throws PifException
	 */
	public Y31AttachmentBean copyFile(String pathFrom, String pathTo, boolean preserveName)
			throws Y31JanoServiceFileNotFoundException, PifException {

		XlnetsUtils.getInstance();
		return this.pifService.copyFile(XlnetsUtils.getTokenAplicacionDocument(), pathFrom, pathTo, preserveName);

	}

	/**
	 * 
	 * @param sSessionToken
	 *            Sesi�n de aplicaci�n que est� escribiendo en el repositorio
	 * @param pathFrom
	 *            Ruta l�gica desde donde se va a mover el fichero. Incluir�
	 *            como carpeta principal la aplicaci�n origen
	 * @return List<Y31AttachmentBean>
	 * @throws PifException
	 */
	public List<Y31AttachmentBean> listFile(String pathFrom) throws PifException {

		XlnetsUtils.getInstance();
		// invocando el metodo
		return this.pifService.listFile(XlnetsUtils.getTokenAplicacionDocument(), pathFrom);

	}

	/**
	 * 
	 * @param sSessionToken
	 *            Sesi�n de aplicaci�n que est� escribiendo en el repositorio
	 * @param pathFrom
	 *            Ruta l�gica desde donde se va a mover el fichero. Incluir�
	 *            como carpeta principal la aplicaci�n origen
	 * @throws PifException
	 */
	public void deleteFile(String pathFrom) throws PifException {

		// invocando el metodo
		this.pifService.deleteFile(XlnetsUtils.getTokenAplicacionDocument(), pathFrom);
	}

	@Override
	public String getCompleteUrl(String filePath, String aplicacion) throws PifException {

		// invocando el metodo
		return this.pifService.getCompleteUrl(filePath, aplicacion);
	}

	/**
	 * Subir documento a PIF
	 *
	 * @param file
	 *            Fichero que se va a subir al PIF para posteriormente subir a
	 *            PID
	 * @param fileName
	 *            Nombre del fichero
	 * @return String
	 * @throws PifException
	 */
	@Override()
	public String putFileToPID(InputStream file, String fileName, String aplicacion) throws PifException {
		PifAdapterServiceImpl.logger.info("putFileToPID - Inicio");
		try {
			String pathTo = "/" + Constantes.PIF_CARPETA_PID + "/" + aplicacion + "/" + fileName;
			XlnetsUtils.getInstance();
			Y31AttachmentBean y31AttachmentBeanResult = this.pifService.putFile(
					XlnetsUtils.getTokenAplicacionDocument(), file, pathTo, true,
					Long.valueOf(Constantes.PIF_TIEMPO_EXISTENCIA));
			return y31AttachmentBeanResult.getFilePath();
		} catch (PifException ePIF) {
			throw ePIF;
		} catch (Exception excep) {
			throw new PifException(excep.getMessage());
		} finally {
			PifAdapterServiceImpl.logger.info("putFileToPID - Final");
		}
	}
}
