/* 
* 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 monitor.utiles;

import java.awt.*;
import java.io.*;
import java.util.*;

public class ConfiguracionBase {

   protected ArrayList<Dato> data;
   String nombreFichero;

   public ConfiguracionBase() {
      data = new ArrayList<Dato>();
   }

   public boolean cargar(String fichero) {
      nombreFichero = fichero;
      try {
         BufferedReader bf = new BufferedReader(new FileReader(fichero));
         String linea;
         while ((linea = bf.readLine()) != null) {
            add(linea);
         }
         bf.close();
         return true;
      } catch (Exception exc) {
         System.out.println(exc.getMessage());
         return false;
      }
   }

   void add(String linea) {
      linea = linea.trim();
      // guardar linea vacias y comentarios
      if (linea.length() == 0 || linea.startsWith("#")) {
         Dato dato = new Dato("##", linea);
         data.add(dato);
         return;
      }
      // procesar las demas lineas, sobreescribiendo las repetidas
      String pp[] = linea.split("=");
      String clave = pp[0].trim();
      String valor = "";
      if (pp.length > 1) {
         valor = pp[1].trim();
      }
      ponValor(clave, valor);
   }

   protected void ponValor(String clave, String valor) {
      Dato dato = buscar(clave);
      if (dato == null) {
         dato = new Dato(clave, valor);
         data.add(dato);
      } else {
         dato.valor = valor;
      }
   }

   public Dato buscar(String clave) {
      for (int i = 0; i < data.size(); i++) {
         Dato d = data.get(i);
         if (d.clave.equalsIgnoreCase(clave)) {
            return d;
         }
      }
      return null;
   }

   public boolean guardar() {
      try {
         PrintWriter pw = new PrintWriter(new FileOutputStream(nombreFichero, false));
         for (int i = 0; i < data.size(); i++) {
            Dato d = data.get(i);
            if (d.clave.equals("##")) {
               pw.println(d.valor);
            } else {
               pw.println(d.clave + "=" + d.valor);
            }
         }
         pw.close();
         return true;
      } catch (Exception exc) {
         System.out.println(exc.getMessage());
         return false;
      }
   }

   protected String valor(String clave, String porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      } else {
         return dato.valor;
      }
   }

   protected int valor(String clave, int porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      }
      try {
         return Integer.parseInt(dato.valor);
      } catch (NumberFormatException exc) {
         return porDefecto;
      }
   }

   protected long valor(String clave, long porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      }
      try {
         return Long.parseLong(dato.valor);
      } catch (NumberFormatException exc) {
         return porDefecto;
      }
   }

   protected float valor(String clave, float porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      }
      try {
         return Float.parseFloat(dato.valor);
      } catch (NumberFormatException exc) {
         return porDefecto;
      }
   }

   protected double valor(String clave, double porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      }
      try {
         return Double.parseDouble(dato.valor);
      } catch (NumberFormatException exc) {
         return porDefecto;
      }
   }

   protected boolean valor(String clave, boolean porDefecto) {
      Dato dato = buscar(clave);
      if (dato == null) {
         return porDefecto;
      }
      if (dato.valor.equalsIgnoreCase("si")) {
         return true;
      }
      return false;
   }

   protected Color valorColor(String clave, Color porDefecto) {
      Dato dato = buscar(clave);
      if (dato != null) {
         try {
            String[] rgb = dato.valor.split(",");
            Color color = new Color(Integer.parseInt(rgb[0].trim()), Integer.parseInt(rgb[1].trim()), Integer.parseInt(rgb[2].trim()));
            return color;
         } catch (Exception exc) {
         }
      }
      return porDefecto;
   }

   protected class Dato {

      public String clave;
      public String valor;

      public Dato(String p1, String p2) {
         clave = p1;
         valor = p2;
      }
   }
}
