/* 
* Copyright 2016 Agencia Estatal de Administración Tibutaria
*
* Licencia con arreglo a la EUPL, Versión 1.1 o –en cuanto
* sean aprobadas por la Comisión Europea– versiones
* posteriores de la EUPL (la «Licencia»);
* Solo podrá usarse esta obra si se respeta la Licencia.
* Puede obtenerse una copia de la Licencia en:
*  
* https://joinup.ec.europa.eu/software/page/eupl
*  
* Salvo cuando lo exija la legislación aplicable o se acuerde
* por escrito, el programa distribuido con arreglo a la
* Licencia se distribuye «TAL CUAL», SIN GARANTÍAS NI CONDICIONES
* DE NINGÚN TIPO, ni expresasni implícitas.
*
* Véase la Licencia en el idioma concreto que rige los permisos y 
* limitaciones que establece la Licencia.
*/ 

package servidor.datos;

import java.io.*;
import java.util.logging.Level;
import servidor.utiles.Global;

public class LogGenerico {

    PrintStream salida = null;
    String path;
    String fichero;
    String contenido;
    File file;

    public LogGenerico(String nombreFichero, String contenido) {
        this("logs", nombreFichero, contenido);
    }

    public LogGenerico(String path, String nombreFichero, String contenido) {
        fichero = nombreFichero;
        this.contenido = contenido;
        this.path = path;
        comprobarDirectorio();
        file = new File(path, fichero);
    }

    final void comprobarDirectorio() {
        File dir = new File(".", path);
        dir.mkdir();
    }

    public boolean noExiste() {
        return !file.exists();
    }

    public void escribir(String linea) {
        try {
            salida = new PrintStream(new FileOutputStream(file, true));
            salida.println(linea);
            salida.close();
        } catch (Exception exc) {
            servidor.ServidorMain.log.log(Level.WARNING, "Error en log de {0}\n{1}", new Object[]{contenido, linea});
        }
    }

    public void abrir() {
        try {
            salida = new PrintStream(new FileOutputStream(file, true));
        } catch (Exception exc) {
            servidor.ServidorMain.log.log(Level.WARNING, "Error al abrir log de {0}\n{1}", new Object[]{contenido, exc.getMessage()});
        }
    }

    public void escribirRapido(String linea) {
        if (salida != null) {
            salida.println(linea);
        }
    }

    public void cerrar() {
        if (salida != null) {
            salida.close();
        }
    }

    public void aligerar(int maxK, int minK) {
        if (salida != null) {
            return;
        }
        int maximo = maxK * 1024;
        int minimo = minK * 1024;
        if (file.length() < maximo) {
            return;
        }
        try {
            File copia = new File("temporalParaCopia");
            file.renameTo(copia);
            BufferedReader bread = new BufferedReader(new FileReader(copia));
            bread.skip(copia.length() - minimo);
            bread.readLine();
            File nuevo = new File(path, fichero);
            PrintStream rescatado = new PrintStream(new FileOutputStream(nuevo, false));
            String linea = "";
            while ((linea = bread.readLine()) != null) {
                rescatado.println(linea);
            }
            rescatado.close();
            bread.close();
            copia.delete();
        } catch (Exception exc) {
        }
    }

    public String leerAString() {
        try {
            if (noExiste()) {
                return "";
            }
            StringBuilder texto = new StringBuilder(32000);
            BufferedReader entrada = new BufferedReader(new FileReader(file));
            String s;
            while ((s = entrada.readLine()) != null) {
                texto.append(s).append("#");
            }
            entrada.close();
            return texto.toString();
        } catch (Exception e) {
            return "";
        }

    }
}
