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

import gestor.datos.*;
import gestor.utiles.CargadorMenuIni;
import java.util.*;

public class SubMenu {

   public String nombre;
   public ArrayList<SubMenu> menus = new ArrayList<SubMenu>();
   public ArrayList<InfoServicio> servicios = new ArrayList<InfoServicio>();
   ArrayList<ElementoOrdenado> ordenados = new ArrayList<ElementoOrdenado>();
   public PanelBotones[] paneles;
   public String[] nombres;
   CargadorMenuIni.datosMenu dm = null;
           
   public SubMenu(String nombre) {
      this.nombre = nombre;
      nombres = new String[gestor.utiles.Global.gestorIdiomas.numeroIdiomas];
      nombres[0] = nombre;
   }
   
   public SubMenu(CargadorMenuIni.datosMenu dm) {
      this.dm = dm;
      this.nombre = dm.nombre;
      nombres = new String[gestor.utiles.Global.gestorIdiomas.numeroIdiomas];
      nombres[0] = dm.textos.get(0);
   }

   public int numBotones() {
      if(Configuracion.instanciaUnica().usandoSubmenus) {
         return ordenados.size();
      } else {
         return menus.size() + servicios.size();
      }
   }

   public void nuevoSubmenu(String[] info) {
      SubMenu menu = new SubMenu(info[0]);
      for (int i = 1; i < info.length; i++) {
         String k = info[i].trim();
         if(k.startsWith("#h") || k.startsWith("#H")) {
             menu.nuevoHueco();
         } else {
            menu.nuevaCola(k);
         }
      }
      menu.crearServicios();
      menus.add(menu);
      ordenados.add(new ElementoOrdenado(menu));
   }

   public void crearSubmenu(CargadorMenuIni cmi, CargadorMenuIni.datosMenu dm) {
      CargadorMenuIni.datosMenu dmn;
      for (int i = 0; i < dm.botones.size(); i++) {
         CargadorMenuIni.datosBoton db = dm.botones.get(i);
         dmn = cmi.buscarMenu(db.nombre);
         if(dmn != null) {
            nuevoSubmenu(cmi, dmn);
         } else if(db.nombre.equalsIgnoreCase("#h")) {
             nuevoHueco();
         } else {
            nuevaCola(db);
         }
      }
   }

   public void nuevoSubmenu(CargadorMenuIni cmi, CargadorMenuIni.datosMenu dm) {
      SubMenu menu = new SubMenu(dm);
      menu.crearSubmenu(cmi, dm);
      menu.crearServicios();
      menus.add(menu);
      ordenados.add(new ElementoOrdenado(menu));
   }

   public void nuevaCola(CargadorMenuIni.datosBoton db) {
      ordenados.add(new ElementoOrdenado(db));
   }

   public void nuevaCola(String cola) {
      ordenados.add(new ElementoOrdenado(cola));
   }

   public void nuevoHueco() {
      ordenados.add(new ElementoOrdenado(true));
   }

   InfoServicio nuevoServicio(RegistroCola regCola) {
      InfoServicios infoServicios = Configuracion.instanciaUnica().infoServicios;
      if (regCola.activa && !regCola.colaEspecial) {
         InfoServicio serv = infoServicios.get(regCola.cola);
         if(serv.visible ) {
            servicios.add(serv);
            ArrayList<InfoServicio> alternativos = infoServicios.listaNombreAlternativos.get(regCola.cola);
            if (alternativos != null) {
               servicios.addAll(alternativos);
            }
            return serv;
         }
      }
      return null;
   }

   public void crearServicios() {
      Configuracion conf = Configuracion.instanciaUnica();
      TablaColas tabColas = TablaColas.getTablaColas();
      if (conf.usandoSubmenus) {
         ArrayList<ElementoOrdenado> ordenados2 = new ArrayList<ElementoOrdenado>();
         ordenados2.addAll(ordenados);
         ordenados.clear();
         for (ElementoOrdenado eo : ordenados2) {
            if(eo.cola != null) {
               RegistroCola reg = tabColas.buscar(eo.cola);
               if(reg != null) {
                  eo.servicio = nuevoServicio(reg);
                  ordenados.add(eo);
                  for(InfoServicio is : servicios) {
                     if(is.cola.equals(eo.cola) && is.esNombreAlternativo) {
                        ElementoOrdenado eo2 = new ElementoOrdenado(is.cola);
                        eo2.servicio = is;
                        ordenados.add(eo2);
                     }
                  }
               }
            } else {
               ordenados.add(eo);
            }
         }
      } else {
         ArrayList<String> visibles = Configuracion.instanciaUnica().serviciosVisibles;
         if(visibles == null || visibles.isEmpty()) {
            for (RegistroCola reg : tabColas) {
               nuevoServicio(reg);
            }
         } else {
            for (int i=0; i< visibles.size(); i++) {
               String colavis = visibles.get(i);
               if(colavis.startsWith("#H")) {
                  InfoServicio hueco = new InfoServicio("hueco");
                  servicios.add(hueco);
               } else {
                  RegistroCola regvis = tabColas.buscar(colavis);
                  if(regvis != null) {
                     nuevoServicio(regvis);
                  }
               }
            }
         }
      }
   }
   
//   void reordenarColas() {
//      ArrayList<String> visibles = Configuracion.instanciaUnica().serviciosVisibles;
//      if(visibles == null || visibles.size() == 0) return;
//      InfoServicio is;
//      String vis;
//      for (int j=0; j< visibles.size(); j++) {
//         for(int i=0;i<servicios.size();i++) {
//            is = servicios.get(i);
//            vis = visibles.get(j);
//            if(is.cola.equals(vis)) {
//               servicios.set(i, servicios.get(j));
//               servicios.set(j, is);
//            }
//         }
//      }
//   }

   class ElementoOrdenado {
      public SubMenu submenu = null;
      public String cola = null;
      public InfoServicio servicio = null;
      public boolean hueco = false;
      public CargadorMenuIni.datosBoton db = null;
      public ElementoOrdenado(SubMenu s) { submenu = s; }
      public ElementoOrdenado(String c) { cola = c; }
      public ElementoOrdenado(CargadorMenuIni.datosBoton db) { 
         this.db = db;
         cola = db.cola; 
      }
      public ElementoOrdenado(boolean hueco) { this.hueco = hueco; }         
   }
}
