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

import gestor.datos.*;
import java.io.*;
import java.util.*;

/**
 *
 * @author admf11600q4
 */
public class CargadorMenuIni {

   almacenLineas lineas;
   public ArrayList<datosMenu> menus;
   private final HashMap<String, datosBoton> botones = new HashMap<>();
   FormateadorBotones formateador;
   
   public CargadorMenuIni() {
      formateador = new FormateadorBotones();
   }
   
   public void cargarIni(File ini) {
      lineas = new almacenLineas(ini);
      menus = new ArrayList<>();

      String linea;
      String lineaCmp;
      datosMenu menuActual = null;
      datosBoton botonActual = null;
      try {
         if (!lineas.lineas.get(0).equalsIgnoreCase("{principal}")) {
            throw new Exception("La primera línea de datos de menu.ini debe ser {PRINCIPAL}");
         }
         while ((linea = lineas.pop()) != null) {
            lineaCmp = linea.toLowerCase();
            if (linea.startsWith("{")) {
               if (botonActual != null) {
                  formateaBoton(botonActual);
                  botonActual = null;
               }
               menuActual = new datosMenu(quitaCorchetes(linea).toUpperCase());
               menus.add(menuActual);
            }
            if (linea.startsWith("[")) {
               if (botonActual != null) {
                  formateaBoton(botonActual);
                  botonActual = null;
               }
               botonActual = new datosBoton(quitaCorchetes(linea).toUpperCase());
               menuActual.botones.add(botonActual);
            }
            if (lineaCmp.startsWith("texto=")) {
               // que pasará si texto se deja en blanco
               String txt = quita(linea, 6);
               botonActual.setTexto(txt);
               botonActual.setTextoSinFormato(txt);
            }
            if (lineaCmp.startsWith("textomenu=")) {
               menuActual.setTexto(quita(linea, 10));
            }
            if (lineaCmp.startsWith("detalle=")) {
               botonActual.detalles = quita(linea, 8);
            }
            if(lineaCmp.startsWith("cola=")) {
               botonActual.cola = quita(linea, 5);
            }
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
      if (botonActual != null) {
         formateaBoton(botonActual);
      }
      for (datosMenu dm : menus) {
         if (dm.textos.get(0).isEmpty()) {
            if (botones.containsKey(dm.nombre)) {
               datosBoton db = botones.get(dm.nombre);
               dm.db = db ;
               dm.setTexto(db.textos.get(0));
               dm.setTextoSinFormato(db.textosSinFormato.get(0));
            } else {
               dm.setTexto(dm.nombre);
               dm.setTextoSinFormato(dm.nombre);
            }
         }
      }
   }

   private void formateaBoton(datosBoton db) {
      String txt;
      try {
         if (db.nombre.equalsIgnoreCase("#h")) {
            db.setTexto("");
            db.setTextoSinFormato("");
            return;
         }
         if (!db.textos.get(0).isEmpty()) {
            txt = db.textos.get(0);
         } else {
            TablaColas tabColas = TablaColas.getTablaColas();
            RegistroCola regCola = tabColas.buscar( db.cola);
            if (regCola != null) {
               txt = regCola.descripcion;
            } else {
               txt = "";
            }
         }
         if (txt.startsWith("<html>")) {
            if(db.detalles != null) {
               db.setTextoSinFormato(db.detalles);
            } else {
               db.setTextoSinFormato(Global.limpiaHtml(txt));
            }            
         } else {
            boolean esMenu = db.nombre.length() > 4;
            String result = formateador.formatear(txt, db.detalles, esMenu);
            db.setTexto(result);
            db.setTextoSinFormato(txt);
         }
         botones.put(db.nombre, db);
      } catch(Exception exc) {
         exc.printStackTrace();
      }
   }

   private String quitaCorchetes(String l) {
      return l.substring(1, l.length() - 1).trim();
   }

   private String quita(String l, int n) {
      return l.substring(n).trim();
   }

   public datosMenu buscarMenu(String nombre) {
      for (datosMenu dm : menus) {
         if (dm.nombre.equalsIgnoreCase(nombre)) {
            return dm;
         }
      }
      return null;
   }

   public datosBoton buscarBoton(String nombre, datosMenu menu) {
      for (datosBoton db : menu.botones) {
         if (db.nombre.equalsIgnoreCase(nombre)) {
            return db;
         }
      }
      return null;
   }

   public void addTraduccion(CargadorMenuIni trad) {
      for (datosMenu dm : menus) {
         datosMenu menuTrad = trad.buscarMenu(dm.nombre);
         if(menuTrad != null) {
            dm.textos.add(menuTrad.textos.get(0));
            dm.textosSinFormato.add(menuTrad.textosSinFormato.get(0));
         } else {
            dm.textos.add("??");
            dm.textosSinFormato.add("??");
            for (datosBoton db : dm.botones) {
               db.textos.add("??");
               db.textosSinFormato.add("??");
            }
            continue;
         }
         for (datosBoton db : dm.botones) {
            datosBoton botonTrad = trad.buscarBoton(db.nombre, menuTrad);
            if(botonTrad != null) {
               db.textos.add(botonTrad.textos.get(0));
               db.textosSinFormato.add(botonTrad.textosSinFormato.get(0));
            } else {
               db.textos.add("??");
               db.textosSinFormato.add("??");
            }
         }
      }
   }

   public class almacenLineas {

      ArrayList<String> lineas = new ArrayList<>();
      int idx = 0;

      public String pop() {
         if (idx == lineas.size()) {
            return null;
         }
         String ret = lineas.get(idx);
         idx++;
         return ret;
      }

      public void push() {
         idx--;
      }

      public almacenLineas(File ini) {
         try {
            BufferedReader bf = new BufferedReader(new FileReader(ini));
            String linea;
            while ((linea = bf.readLine()) != null) {
               linea = linea.trim();
               if (!linea.isEmpty() && !linea.startsWith("#")) {
                  lineas.add(linea);
               }
            }
         } catch (Exception exc) {
            exc.printStackTrace();
         }
      }
   }

   private class datos {
      public String cola;
      public String nombre;
      public ArrayList<String> textos = new ArrayList<>();
      public ArrayList<String> textosSinFormato = new ArrayList<>();
      
      protected datos(String n) {
         nombre = n;
         cola = nombre;
         textos.add("");
         textosSinFormato.add("");
      }
      
      public void setTexto(String s) {
         textos.set(0, s);
      }
      public void setTextoSinFormato(String s) {
         textosSinFormato.set(0, s);
      }
   }
   
   public class datosMenu extends datos {

      public datosMenu(String n) {
         super(n);
      }
      public datosBoton db = null;
      public ArrayList<datosBoton> botones = new ArrayList<>();
   }

   public class datosBoton  extends datos{

      public datosBoton(String n) {
         super(n);
      }
      public String detalles;
   }
}
