package com.ejie.ad74a.util;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;

import javax.xml.datatype.XMLGregorianCalendar;

import org.apache.commons.io.FileUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ejie.ad74a.exception.Ad74aException;


/**
 * Clase estática encargada de la generación y escritura de los archivos de
 * integración con SIPCA. Sirve además, para generar el archivo de log de los procesos.
 * @author GAOLALVI
 */
public class Ad74aGestionArchivo {
	private static final int TAMANOBUFFER = 1024;

	private File fichero;
	private XMLGregorianCalendar fechaCreacionFic;
	private static final Logger logger = LoggerFactory.getLogger(Ad74aGestionArchivo.class);

	/**
	 * Constructor de la clase
	 * @param nombreFichero Nombre del fichero
	 */
	public Ad74aGestionArchivo(String nombreFichero) {
		if (nombreFichero != null && !"".equals(nombreFichero)) {
			this.fichero = new File(nombreFichero);
		}
	}

	/**
	 * Constructor de la clase
	 * @param pathFichero Path o ruta del fichero
	 * @param nombreFichero Nombre del fichero
	 */
	public Ad74aGestionArchivo(String pathFichero, String nombreFichero) throws Exception{
		
		if (pathFichero != null && !"".equals(pathFichero) && nombreFichero != null && !"".equals(nombreFichero)) {
			this.fichero = new File(pathFichero + "/" + nombreFichero);
		}
	}

	/**
	 * Constructor de la clase
	 * @param fichero Fichero
	 */
	public Ad74aGestionArchivo(File fichero) {
		if (fichero != null) {
			this.fichero = fichero;
		}
	}

	public Ad74aGestionArchivo() {

	}

	/**
	 * Método encargado de crear un nuevo fichero (objeto File) en caso de que no exista.
	 * @throws Ad74aException Excepción
	 */
	public void crearFichero() throws Ad74aException {
		try {
			if (!this.fichero.exists()) {
				this.fichero.createNewFile();
				logger.info("Crea nuevo fichero");
			} else {
				logger.info("Fichero ya existe");
			}
		} catch (IOException e) {
			logger.error(this.getClass().getName() + ".crearFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".crearFichero()-->" + Ad74aException.escribirStackTrace(e));
		}
	}
	
	/**
	 * Método encargado de crear un nuevo directorio en caso de que no exista.
	 * @throws IOException Excepción
	 */
	public void crearDirectorio(String dirPath) throws IOException {

		Path dir = Paths.get(dirPath);
		
		// Si no existe lo creamos
		if (Files.notExists(dir)) {
		    // Directory not exists
		    File directory = new File(dirPath);
		    System.out.println("Directorio " + dirPath + " creado.");
		    directory.mkdir();
		}
	}
	
	/**
	 * Método encargado de borrar un nuevo directorio en caso de que no exista.
	 * @throws IOException Excepción
	 */
	public void borrarDirectorio(String dirPath) throws IOException {
		
		File file = new File(dirPath);
        FileUtils.deleteDirectory(file);
     
	}

	/**
	 * Método encargado de borrar un fichero existente
	 */
	public void borrarFichero() {
		if (this.fichero.exists()) {
			this.fichero.delete();
		}
	}

	/**
	 * Este método inserta el contenido de un String que se pasa por
	 * parametro en un fichero de texto.
	 * @param contenido Contenido a insertar en el fichero
	 * @throws Ad74aException Excepción
	 */
	public void escribirFichero(String contenido) throws Ad74aException {
		FileWriter fw = null;
		BufferedWriter bw = null;
		PrintWriter salida = null;
		try {
			fw = new FileWriter(this.fichero, true);
		    bw = new BufferedWriter(fw);
		    salida = new PrintWriter(bw);
		    salida.print(contenido);
		} catch (IOException e) {
			logger.error(this.getClass().getName() + ".escribirFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".escribirFichero()-->" + Ad74aException.escribirStackTrace(e));
		} finally {
			try {
				if (salida != null) {
					salida.close();
				}
				if (bw != null) {
					bw.close();
				}
				if (fw != null) {
					fw.close();
				}
				
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".escribirFichero()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".escribirFichero()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
	}

	/**
	 * Este método inserta una línea en un fichero de texto.
	 * @param linea Contenido a insertar en el fichero
	 * @throws Ad74aException Excepción
	 */
/*	public void escribirLinea(String linea) throws Ad74aException {
		logger.info(linea);
		this.escribirLinea(linea, true);
	}
*/
	/**
	 * Este método inserta una línea en un fichero de texto.
	 * @param linea Contenido a insertar en el fichero
	 * @param log Si es true escribe la fecha y hora actual antes del contenido de línea
	 * @throws Ad74aException Excepción
	 */
/*	public void escribirLinea(String linea, boolean log) throws Ad74aException {
		FileWriter fw = null;
		BufferedWriter bw = null;
		PrintWriter salida = null;
		try {
			fw = new FileWriter(this.fichero, true);
		    bw = new BufferedWriter(fw);
		    salida = new PrintWriter(bw);
		    StringBuffer lineaAux = new StringBuffer();
		    if (log) {
		    	lineaAux.append(Ae01bFecha.obtenerFechaHoraActual(Ae01bFecha.FORMATO_FECHAS));
		    	lineaAux.append(" --> ");
		    }
	    	if (linea != null && !"".equals(linea)) {
	    		lineaAux.append(linea);
		    }
		    lineaAux.append("\n");
		    salida.print(lineaAux.toString());
		} catch (IOException e) {
			logger.error(this.getClass().getName() + ".escribirLinea()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".escribirLinea()-->" + Ad74aException.escribirStackTrace(e));
			
			
		} finally {
			try {
				if (salida != null) {
					salida.close();
				}
				if (bw != null) {
					bw.close();
				}
				if (fw != null) {
					fw.close();
				}
			    
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".escribirLinea()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".escribirLinea()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
    }
*/
	/**
	 * Método de lectura de ficheros de texto
	 * @return String contenido del fichero de texto
	 * @throws Ad74aException Excepción
	 */
/*	public String leerFichero() throws Ad74aException {
		FileReader fr = null;
		BufferedReader br = null;
		try {
			StringBuffer buffer = new StringBuffer();
			String linea = null;
			fr = new FileReader(this.fichero);
			br = new BufferedReader(fr);
			while ((linea = br.readLine()) != null) {
				buffer.append(linea + "\n");
			}
			return buffer.toString();
		} catch (IOException e) {
			throw new Ad74aException(Ae01bErroresSIPCA.ERROR_FICHERO_LEER,
					this.fichero.getName(), null, e);
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (fr != null) {
					fr.close();
				}
			    
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".leerFichero()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".leerFichero()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
	}
*/
	/**
	 * Método de lectura de ficheros de texto
	 * @return ArrayList Array de strings con las líneas del fichero de texto
	 * @throws Ad74aException Excepción
	 */
	public ArrayList leerLineas() throws Ad74aException {
		FileReader fr = null;
		BufferedReader br = null;
		try {
			ArrayList arrayLineas = new ArrayList();
			String linea = null;
			fr = new FileReader(this.fichero);
			br = new BufferedReader(fr);
			while ((linea = br.readLine()) != null) {arrayLineas.add(linea);
			}
			return arrayLineas;
		} catch (IOException e) {
			logger.error(this.getClass().getName() + ".leerLineas()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".leerLineas()-->" + Ad74aException.escribirStackTrace(e));
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (fr != null) {
					fr.close();
				}
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".leerLineas()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".leerLineas()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
	}

	/**
	 * Método de lectura de ficheros de texto
	 * @param numLinea Número de línea (empieza desde 1)
	 * @return String Contenido de la línea introducida del fichero de texto
	 * @throws Ad74aException Excepción
	 */
	public String leerLinea(int numLinea) throws Ad74aException {
		FileReader fr = null;
		BufferedReader br = null;
		try {
			String linea = null;
			fr = new FileReader(this.fichero);
			br = new BufferedReader(fr);
			int contador = 1;
			while ((linea = br.readLine()) != null) {
				if (contador == numLinea) {
					break;
				}
				contador++;
			}
			return linea;
		} catch (IOException e) {
			//logger.error(this.getClass().getName() + ".leerLinea()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".leerLinea()-->" + Ad74aException.escribirStackTrace(e));
		} finally {
			try {
				if (br != null) {
					br.close();
				}
				if (fr != null) {
					fr.close();
				}
			} catch (IOException e) {
				//logger.error(this.getClass().getName() + ".leerLinea()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".leerLinea()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
	}

	/**
	 * Buscar los ficheros que hay en un directorio
	 * @param pathFichero Path o ruta del fichero
	 * @return Array de ficheros
	 */
/*	public File[] buscarFicherosDirectorio(String pathFichero) {
		File[] arrayFicheros = null;
		if (pathFichero != null && !"".equals(pathFichero)) {
			File dir = new File(pathFichero);
			arrayFicheros = new File[] {};
			arrayFicheros = dir.listFiles();
		}
		return arrayFicheros;
	}
*/
    /**
     * Copia un fichero a un destino
     * @param pathDestino Path o ruta del fichero de destino
     * @throws Ad74aException Excepción
     */
    public void copiarFichero(String pathDestino) throws Ad74aException {
    	InputStream in = null;
    	OutputStream out = null;
    	try {
	    	in = new FileInputStream(this.fichero);
	        File dirDestino = new File(pathDestino);
	        out = new FileOutputStream(dirDestino);
	        byte[] buf = new byte[Ad74aGestionArchivo.TAMANOBUFFER];
	        int len;
	        while ((len = in.read(buf)) > 0) {
	            out.write(buf, 0, len);
	        }
        } catch (IOException ioe) {
			logger.error(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(ioe));
			throw new Ad74aException(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(ioe));
		} catch (Exception e) {
			logger.error(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(e));
		} finally {
			try {
		        if (in != null) {
		        	in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".copiarFichero()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
    }

    /**
     * Mueve un fichero a un destino
     * @param pathDestino Path o ruta del fichero de destino
     * @throws Ad74aException Excepción
     */
/*    public void moverFichero(String pathDestino) throws Ad74aException {
    	InputStream in = null;
    	OutputStream out = null;
    	try {
	    	in = new FileInputStream(this.fichero);
	        File dirDestino = new File(pathDestino);
	        out = new FileOutputStream(dirDestino);
	        byte[] buf = new byte[Ad74aGestionArchivo.TAMANOBUFFER];
	        int len;
	        while ((len = in.read(buf)) > 0) {
	            out.write(buf, 0, len);
	        }
	        this.fichero.delete();
        } catch (IOException e) {
			logger.error(this.getClass().getName() + ".moverFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(this.getClass().getName() + ".moverFichero()-->" + Ad74aException.escribirStackTrace(e));
        } finally {
			try {
				if (in != null) {
		        	in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				logger.error(this.getClass().getName() + ".moverFichero()-->" + Ad74aException.escribirStackTrace(e));
				throw new Ad74aException(this.getClass().getName() + ".moverFichero()-->" + Ad74aException.escribirStackTrace(e));
			}
		}
    }
*/
    /**
	 * Método encargado de comprobar si existe el fichero.
	 * @return boolean True si existe el fichero; False si no existe
	 */
	public boolean existeFichero() {
		boolean resultado = false;
		if (this.fichero.exists()) {
			resultado = true;
		}
		return resultado;
	}

	/**
	 * Método encargado de eliminar todos los ficheros de un directorio
	 * con fecha anterior a un número n de días con respecto a la fecha actual.
	 * @param path Path o ruta a purgar
	 */
/*	public void purgarDirectorio(String path) {
		long fechaActual = System.currentTimeMillis();
		long fechaFichero = 0;
		long fechaMenosDiasPurgado = 0;
		File[] arrayFichDirectorio = this.buscarFicherosDirectorio(path);
		for (int i=0; i<arrayFichDirectorio.length; i++) {
			fechaFichero = arrayFichDirectorio[i].lastModified();
			fechaMenosDiasPurgado = fechaActual - (Ae01bConstantesSIPCA.DIAS_PURGADO_HISTORIAL * Ae01bConstantesSIPCA.HORAS * Ae01bConstantesSIPCA.MINUTOS * Ae01bConstantesSIPCA.SEGUNDOS * Ae01bConstantesSIPCA.MILISEGUNDOS);
			if (new Timestamp(fechaFichero).before(new Timestamp(fechaMenosDiasPurgado))) {
				arrayFichDirectorio[i].delete();
			}
		}
	}
*/
	/**
	 * Getter de fichero
	 * @return fichero Fichero
	 */
	public File getFichero() {
		return this.fichero;
	}

	/**
	 * Setter de fichero
	 * @param fichero Fichero
	 */
	public void setFichero(File fichero) {
		this.fichero = fichero;
	}
	
	public XMLGregorianCalendar getFechaCreacionFic() {
		return fechaCreacionFic;
	}

	public void setFechaCreacionFic(XMLGregorianCalendar fechaCreacionFic) {
		this.fechaCreacionFic = fechaCreacionFic;
	}

	/**
	 * Método encargardo de crear el fichero correspondiente según 
	 * los parámetros tipo fichero
	 * @param tipoFichero String
	 * @throws Ae01bbSIPCAException Excepción
	 */
/*	
	public static Ad74aGestionArchivo gestionaFichero(String tipoFichero, String pathFic, ConfSipca confSipca, List<Ficheros> listaFicGenerados) throws Ad74aException{
		
		Ae01bFicherosDao ficherosDao = new Ae01bFicherosDao();
		Ficheros fichero = new Ficheros();
		StringBuilder cabeceraFic = new StringBuilder();
		StringBuilder nombreFic = new StringBuilder();
		StringBuilder nombreFichero0 = new StringBuilder();
		
		try {
			
			if (listaFicGenerados != null && listaFicGenerados.isEmpty()) {
				fichero = ficherosDao.obtenerDatosUltimoFicheros(fichero, tipoFichero);
				
				if (fichero != null && Ae01bUtils.estaVacio(fichero.getNomFichero05())) {
					nombreFichero0.append(tipoFichero);
					nombreFichero0.append("_").append(confSipca.getCodEntidad07()).append(confSipca.getSufijo07()).append("_").append(Ae01bConstantesSIPCA.CONSTANTE_6_CERO);
					fichero.setNomFichero05(nombreFichero0.toString());
				}
			}else {
				fichero = ficherosDao.obtenerDatosultimoFicheroList(listaFicGenerados);
			}
			
			String correlativo = Ae01bUtils.numFicheroMasUno(fichero.getNomFichero05()); 
			StringBuilder nombreFichero = new StringBuilder();
			
			nombreFic.append(tipoFichero);
			nombreFichero.append(nombreFic).append("_").append(confSipca.getCodEntidad07()).append(confSipca.getSufijo07()).append("_").append(correlativo);
			
			//CALCULA CABECERA
			cabeceraFic.append(Ae01bConstantesSIPCA.TIPO_REGISTRO_CABECERA_FICHERO).append("  ").append(confSipca.getNumEntidad07()).append(confSipca.getSufijo07()).append(Ae01bConstantesSIPCA.CONSTANTE_1_CERO).append(correlativo).append("       ").append(Ae01bFecha.obtenerFechaHoraActual(Ae01bFecha.FORMATO_FECHAS_SIPCA)).append(Ae01bConstantesSIPCA.CONSTANTE_1_ESPACIO);
			
			//Se genera el fichero y la cabecera del mismo
			Ad74aGestionArchivo fic = new Ad74aGestionArchivo(pathFic, nombreFichero.toString());
			fic.escribirLinea(cabeceraFic.toString(), false);
			
			return fic;
			
		} catch (Exception e) {
			logger.error(Ad74aGestionArchivo.class.getName() + ".getionaFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(Ad74aGestionArchivo.class.getName() + ".getionaFichero()-->" + Ad74aException.escribirStackTrace(e));
		}
	}
	
	/**
	 * Método encargardo de crear el fichero correspondiente según 
	 * los parámetros tipo fichero
	 * @param tipoFichero String
	 * @throws Ae01bbSIPCAException Excepción
	 */
/*	
	public static Ad74aGestionArchivo gestionaFicheroCSB19(String tipoFichero, String pathFic, ConfSipca confSipca, List<Ficheros> listaFicGenerados) throws Ad74aException{
		
		Ae01bFicherosDao ficherosDao = new Ae01bFicherosDao();
		Ficheros fichero = new Ficheros();
		StringBuilder nombreFic = new StringBuilder();
		StringBuilder nombreFichero0 = new StringBuilder();
		
		try {
			
			if (listaFicGenerados != null && listaFicGenerados.isEmpty()) {
				fichero = ficherosDao.obtenerDatosUltimoFicheros(fichero, tipoFichero);
				
				if (fichero != null && Ae01bUtils.estaVacio(fichero.getNomFichero05())) {
					nombreFichero0.append(tipoFichero);//tipoFichero = "_2_"
					nombreFichero0.append(confSipca.getCodEntidad07()).append(confSipca.getSufijo07()).append("_").append(Ae01bConstantesSIPCA.CONSTANTE_6_CERO);
					fichero.setNomFichero05(nombreFichero0.toString());
				}
			}else {
				fichero = ficherosDao.obtenerDatosultimoFicheroList(listaFicGenerados);
			}
			
			String correlativo = Ae01bUtils.numFicheroMasUno(fichero.getNomFichero05()); 
			StringBuilder nombreFichero = new StringBuilder();
			
			nombreFic.append(tipoFichero).append("_");//tipoFichero = "csb19_2_"
			nombreFichero.append(nombreFic).append(confSipca.getCodEntidad07()).append(confSipca.getSufijo07()).append("_").append(correlativo);		
			
			//Se genera el fichero vacío
			Date date = new Date();
			GregorianCalendar gcal = new GregorianCalendar();
			DateFormat df = new SimpleDateFormat(Ae01bFecha.FORMATO_FECHAS_CABECERA_XML);
		    date = df.parse(Ae01bFecha.obtenerFechaHoraActual(Ae01bFecha.FORMATO_FECHAS_CABECERA_XML));
		    gcal = new GregorianCalendar();
		    gcal.setTime(date);
		    XMLGregorianCalendar dateXMLGregCalCargo = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcal);
			Ad74aGestionArchivo fic = new Ad74aGestionArchivo(pathFic, nombreFichero.toString());
			fic.setFechaCreacionFic(dateXMLGregCalCargo);
			fic.crearFichero();
			
			return fic;
			
		} catch (Exception e) {
			logger.error(Ad74aGestionArchivo.class.getName() + ".gestionaFicheroCSB19()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(Ad74aGestionArchivo.class.getName() + ".gestionaFicheroCSB19()-->" + Ad74aException.escribirStackTrace(e));
		}
	}

	public void escribeFinalFichero(List<Ficheros> listaFicGenerados, ConfSipca confSipca) throws Ad74aException{
		
		Ficheros fichero = null;
		Ad74aGestionArchivo fic = null;
		
		try {
			//Recorre la lista con todos los ficheros generados y escribe el final (Total) del fichero.
			for (int i = 0; i < listaFicGenerados.size(); i++) {
				
				fic = listaFicGenerados.get(i).getFic();
				fichero = listaFicGenerados.get(i);
				StringBuilder finalFichero = new StringBuilder();
				//Compone la línea de final/total de fichero.
				finalFichero.append(Ae01bConstantesSIPCA.TIPO_REGISTRO_TOTAL_FICHERO);//Tipo registro (Total fichero 05) Longitud 2
				finalFichero.append(Ae01bConstantesSIPCA.CONSTANTE_2_ESPACIO);// Libre (Vacío) Longitud 2
				finalFichero.append(confSipca.getNumEntidad07());//Entidad emisora Longitud 8
				finalFichero.append(confSipca.getSufijo07());//Sufijo Longitud 3
				finalFichero.append(Ae01bConstantesSIPCA.CONSTANTE_13_ESPACIO);// Libre (Vacío) Longitud 13
				finalFichero.append(Ae01bUtils.lpad(String.valueOf(fichero.getTotalLineas() + 2), Ae01bConstantesSIPCA.CONSTANTE_1_CERO, Ae01bConstantesSIPCA.CONSTANTE_8));//Total líneas incluyendo cabecera y fin de fichero.
				finalFichero.append(Ae01bUtils.lpad(Ae01bUtils.transformarEurosACents(fichero.getTotalImporte().toString()), Ae01bConstantesSIPCA.CONSTANTE_1_CERO, Ae01bConstantesSIPCA.CONSTANTE_13));//Importe en céntimos de Euro Longitud 13
				
				//Escribe en el fichero correspondiente la línea de final/total de fichero.
				fic.escribirFichero(finalFichero.toString());
				
				boolean esFicheroBorrado = this.borraFicherosSinLineasDetalle(fichero);
				
				if (!esFicheroBorrado) {
					logger.info("Fichero: " + fichero.getNomFichero05() + " finalizado con éxito");
					
				}else {
					logger.info("Fichero: " + fichero.getNomFichero05() + " fichero borrado por contener sólo incidencias");
				}
			}
		} catch (Exception e) {
			logger.error(Ad74aGestionArchivo.class.getName() + ".escribeFinalFichero()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(Ad74aGestionArchivo.class.getName() + ".escribeFinalFichero()-->" + Ad74aException.escribirStackTrace(e));
		}
	}
		
	public void escribeFicherosXML(List<Ficheros> listaFicGenerados, ConfSipca confSipca) throws Ad74aException{
		
		Ficheros fichero = null;
		Ad74aGestionArchivo fic = null;
		Document doc = null;
		
		try {
			//Recorre la lista con todos los ficheros generados y escribe el contenido XML del los ficheros y actualiza la tabla de liquidaciones.
			for (int i = 0; i < listaFicGenerados.size(); i++) {
				fichero = listaFicGenerados.get(i);
				fic = listaFicGenerados.get(i).getFic();
				doc = fichero.getDocument();
				String xml = UtilidadesXML.marshalObjectWS(doc).replace("<document xmlns=\"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02\">", "<Document xmlns=\"urn:iso:std:iso:20022:tech:xsd:pain.008.001.02\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">").
																replace("</document>", "</Document>").
																replace("<?xml version=\"1.0\" encoding=\"ISO-8859-1\" standalone=\"yes\"?>", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>").
																replace(".000+01:00", "").
																replace("+02:00", "").
																replace("+01:00", "");
				fic.escribirFichero(xml);
				
				logger.info("Fichero: " + fichero.getNomFichero05() + " finalizado con éxito");
			}
		} catch (Exception e) {
			logger.error(Ad74aGestionArchivo.class.getName() + ".escribeFicherosXML()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(Ad74aGestionArchivo.class.getName() + ".escribeFicherosXML()-->" + Ad74aException.escribirStackTrace(e));
		}
	}
	
	public boolean borraFicherosSinLineasDetalle(Ficheros fichero) throws Ad74aException{
		
		boolean esFicheroBorrado = false;
		
		try {
			Ad74aGestionArchivo fic = fichero.getFic();
			//Intenta leer la línea  las líneas del fichero, si sólo hay 2 se borra, no es necesario porque no tiene líneas detalle
			try{
				//Código que intenta leer la línea 3 del fichero si existe no hace nada (y sigue con el siguiente fichero), si entra por la excepción Ad74aException
				//borra el fichero tanto físicamente como de la tabla de ficheros. Además trata la los campos de liquidación y los 
				//pasa de nuevo a null.
				String linea = fic.leerLinea(Ae01bConstantesSIPCA.CONSTANTE_3);
				
				if (Ae01bUtils.estaVacio(linea)) {
					esFicheroBorrado = true;
					logger.error(Ad74aGestionArchivo.class.getName() + ".borraFicherosSinLineasDetalle() Borra el fichero de nombre--> " + fichero.getNomFichero05());
					Ae01bFicherosDao ficDao = new Ae01bFicherosDao();
					Ae01bLiquidacionDao liqDao = new Ae01bLiquidacionDao();
					fic.borrarFichero();
					ficDao.deleteFichero(fichero);
					if (!Ae01bUtils.estaVacio(fichero.getIdFichero05())) {
						liqDao.updateLiquidacionesDesmarca2fn77a101(fichero.getIdFichero05().toString());
					}
				}
				
				} catch (Ad74aException exp){
					logger.error(Ad74aGestionArchivo.class.getName() + ".borraFicherosSinLineasDetalle()-->" + "No hay fichero a borrar. Fichero sólo con incidencias y no ha sido generado");
				}
			
				return esFicheroBorrado;
			
		}catch (Exception e) {
			logger.error(Ad74aGestionArchivo.class.getName() + ".borraFicherosSinLineasDetalle()-->" + Ad74aException.escribirStackTrace(e));
			throw new Ad74aException(Ad74aGestionArchivo.class.getName() + ".borraFicherosSinLineasDetalle()-->" + Ad74aException.escribirStackTrace(e));
		}
	}	
*/
}