// 
// 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.
// 

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace gestor.utiles
{
    public class LogGenerico
    {
        StreamWriter salida = null;
        string path;
        string fichero;
        string contenido;
        string 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;
            file = Path.Combine(path, fichero);
            comprobarDirectorio();
        }

        void comprobarDirectorio() {
            Directory.CreateDirectory(path);
        }

        public bool noExiste() {
            return !File.Exists(file);
        }

        public void escribir(string linea) {
            try {
                salida = new StreamWriter(file, true, Encoding.Default);
                salida.WriteLine(linea);
                salida.Close();
            } catch { }
        }

        public bool abrir() {
            try {
                salida = new StreamWriter(file, true, Encoding.Default);
                return true;
            } catch { return false; }
        }

        public void escribirRapido(string linea) {
            if (salida != null) {
                salida.WriteLine(linea);
            }
        }

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

        public void aligerar(int maxK, int minK) {
            if (salida != null) {
                return;
            }
            FileInfo fi = new FileInfo(file);
            int maximo = maxK * 1024;
            int minimo = minK * 1024;
            if (fi.Length < maximo) {
                return;
            }
            try {
                string copia = Path.Combine(path, "temporalParaCopia");
                fi.MoveTo(copia);
                StreamReader bread = new StreamReader(copia, Encoding.Default);
                bread.BaseStream.Seek(fi.Length - minimo, SeekOrigin.Begin);
                StreamWriter rescatado = new StreamWriter(file, false, Encoding.Default);
                string linea = "";
                while ((linea = bread.ReadLine()) != null) {
                    rescatado.WriteLine(linea);
                }
                rescatado.Close();
                bread.Close();
                File.Delete(copia);
            } catch {}
        }
    }
}
