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

import java.io.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class ConfiguracionBase {
   protected ArrayList data;
   String nombreFichero;
   
   public ConfiguracionBase() {
	  data = new ArrayList();
   }
   
   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;
	  }
   }
   protected void ponValor(String clave, Date valor) {
		  Dato dato = buscar(clave);
		  String strValor;
          SimpleDateFormat dateFormatDMA = new java.text.SimpleDateFormat("dd/MM/yyyy");
          strValor=new String(dateFormatDMA.format(valor));
		  if(dato == null) {
			 dato = new Dato(clave, strValor);
			 data.add(dato);
		  } else {
			 dato.valor = strValor;
		  }
	   }
   public Dato buscar(String clave) {
	  for(int i=0;i<data.size();i++) {
		 Dato d = (Dato)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 = (Dato)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 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 Date valor(String clave, Date porDefecto) {
       Dato dato = buscar(clave);
       if(dato != null) {
           try {
               SimpleDateFormat dateFormatDMA = new java.text.SimpleDateFormat("dd/MM/yyyy");
               return dateFormatDMA.parse(dato.valor);
           } catch(ParseException exc) {
               String msg = "Valor de fecha ERRONEO en campo " + clave + " en " + nombreFichero;
               Global.log.warning(msg);
           }
       }
       return porDefecto;
   }
   protected String valor(String clave) {
       Dato dato = buscar(clave);
       if(dato == null) return null;
       else return dato.valor;
   }

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