/* 
* 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.*;
import java.io.*;
import java.util.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;

public class GeneradorAyuda {

   InfoServicios servicios;
   HashMap<String, String> paginas;
   ArrayList<DatoXml> datos;
   String grande = "<font face='arial' size=6>";
   String fgrande = "</font>";

   public GeneradorAyuda(InfoServicios servicios) {
      this.servicios = servicios;
      datos = new ArrayList<>();
      paginas = new HashMap<>();
   }

   public String pagina(String nombre) {
      String pag = paginas.get(nombre);
      if (pag != null) {
         return pag;
      }
      return "";
   }

   public DatoXml datosayuda(String cola) {
      for(DatoXml dato : datos) {
         if(dato.cola.equals(cola)) {
            return dato;
         }
      }
      return null;
   }

   public boolean generar(String ficheroXml) {
      try {
         File fichero = new File(ficheroXml);
         if(!fichero.exists()) {
            return false;
         }
         Document doc = abrirXml(ficheroXml);
         Element raiz = doc.getDocumentElement();
         NodeList nodos = raiz.getElementsByTagName("item");
         for (int i = 0; i < nodos.getLength(); i++) {
            Node nodo = nodos.item(i);
            Node attCola = nodo.getAttributes().getNamedItem("cola");
            String cola = attCola.getNodeValue().toUpperCase();
            Node attDescripcion = nodo.getAttributes().getNamedItem("descripcion");
            String descripcion = null;
            if(attDescripcion != null) {
               descripcion = attDescripcion.getNodeValue().toUpperCase();
            }
            Node attImagen = nodo.getAttributes().getNamedItem("imagen");
            String imagen = null;
            if (attImagen != null) {
               imagen = attImagen.getNodeValue();
            }
            Node attTique = nodo.getAttributes().getNamedItem("tique");
            boolean tique = true;
            if(attTique != null) {
               String sTique = attTique.getNodeValue();
               if(sTique.equalsIgnoreCase("no")) {
                  tique = false;
               }
            }
            String contenido = innerXml(nodo);
            if(cola.equals("#CP") || cola.equals("DNIE")) {
               if(cola.equals("#CP") && descripcion == null) {
                  descripcion = "CITA PREVIA";
               }
               DatoXml dato = new DatoXml(cola, descripcion, imagen, contenido);
               dato.tique = tique;
               datos.add(dato);
            }

            if (servicios.servicios.containsKey(cola)) {
               InfoServicio info = servicios.get(cola);
               if(info.visible) {
                  DatoXml dato = new DatoXml(cola, info.getDescripcion(), imagen, contenido);
                  dato.tique = tique;
                  datos.add(dato);
               }
            }
         }

//         if(Global.versionSO() > 5) {
//           insertarAyudaDNIe();
//        }

         generarMenu();
         generarPaginas();
         return true;

      } catch (Exception exc) {
         exc.printStackTrace();
      }
      return false;
   }

   void insertarAyudaDNIe() {
      for(DatoXml dx: datos) {
         if(dx.cola.equals("DNIE")) {
            return;
         }
      }
      String cola = "DNIE";
      String titulo = "Uso del DNIe";
      String img = "cartel_dnie.jpg";
      String contenido = "Puede utilizar su DNIe para introducir automáticamente " +
              "su número de DNI y sus apellidos cuando sea necesario" +
              "<p>No hace falta introducir el PIN";
      DatoXml dato = new DatoXml(cola, titulo, img, contenido );
      dato.tique = false;
      datos.add(dato);
   }

   Document abrirXml(String ficheroXml) throws Exception {
      DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
      File file = new File(ficheroXml);
      Document doc = docBuilder.parse(file);
      return doc;
   }

   void generarMenu() {
      String html = "<html>";
      html += "<img src='file:ayuda\\cabecera.jpg'>";
      html += "<br><br>&nbsp;&nbsp;" + grande + Global.gestorIdiomas.traduccionActual().valor("ServiciosDisponibles") + fgrande + "<br>";
      int n = datos.size();
      int filas = (n + 1) / 2;
      html += "<table width='100%' height='100%' cellpadding='15'>";
      int i = 0;
      for (int fi = 0; fi < filas; fi++) {
         html += "<tr >";
         // columna izquierda
         html += creaCelda(i++);
         // columna derecha
         if (i < n) {
            html += creaCelda(i++);
         }
         html += "</tr>";
      }
      html += "</table></html>";
      paginas.put("menu", html);
   }

   void generarPaginas() {
       for (DatoXml dato : datos) {
           String html = "<html>";
           html += "<img style='width: 514px; height: 155px;' src='file:ayuda\\";
           if (dato.imagen == null) {
               html += "cabecera.jpg'>";
           } else {
               html += dato.imagen + "'>";
           }
           html += "<br><br><font face='arial' color='blue' size=6>" + dato.titulo + "</font><br><br>";
           html += "<font face='arial' size=5>";
           String contenido = dato.contenido.replaceAll("\\n", "<br><br>");
           html += contenido + "<br>";
           html += "</font></html>";
           paginas.put(dato.cola, html);
       }
   }

   public String generarPaginaVacia(String cola) {
      InfoServicio is = Global.panel.infoServicios.get(cola);
      String nombre = is.getDescripcion();
      String html = "<html>";
      html += "<img style='width: 514px; height: 155px;' src='file:ayuda\\";
      html += "cabecera.jpg'>";
      html += "<br><br><font face='arial' color='blue' size=6>" + nombre + "</font><br><br>";
      html += "<font face='arial' size=5>";
      String texto = Global.gestorIdiomas.traduccionActual().valor("noHayAyuda");
      if(texto == null || texto.equals("")) {
         texto = "No hay ayuda definida para este tema";
      }
      html += texto + "<br>";
      html += "</font></html>";
      return html;
   }

   String creaCelda(int i) {
      String cont = "";
      DatoXml dato = datos.get(i);
      cont += "<td>" + grande + "<a href='cola=" + dato.cola + "'>";
      cont += dato.titulo;
      cont += "</a>" + fgrande + "</td>";
      return cont;
   }

   String innerXml(Node nodo) {
      StringBuilder sb = new StringBuilder(250);
      if (nodo.hasChildNodes()) {
         Node n = nodo.getFirstChild();
         while (n != null) {
            if (n.getNodeType() == Node.TEXT_NODE) {
               sb.append(n.getNodeValue());
            } else {
               sb.append(outerXml(n));
            }
            n = n.getNextSibling();
         }
      }
      return sb.toString();
   }

   String outerXml(Node nodo) {
      StringBuilder sb = new StringBuilder(250);
      sb.append('<').append(nodo.getNodeName());
      NamedNodeMap nnm = nodo.getAttributes();
      for (int i = 0; i < nnm.getLength(); i++) {
         Node att = nnm.item(i);
         sb.append(" ").append(att.getNodeName()).append("='").append(att.getNodeValue()).append("'");
      }
      sb.append('>');
      if (nodo.hasChildNodes()) {
         sb.append(innerXml(nodo));
      }
      sb.append("</").append(nodo.getNodeName()).append('>');
      return sb.toString();
   }

   public class DatoXml {

      public String cola;
      public String imagen;
      public String contenido;
      public String titulo;
      public boolean tique = true;

      public DatoXml(String co, String ti, String im, String con) {
         cola = co;
         imagen = im;
         contenido = con;
         titulo = ti;
      }
   }
}
