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

import com.sun.net.httpserver.*;
import java.io.*;
import java.util.*;
import servidor.comunicaciones.*;
import servidor.utiles.*;

public class AdministracionHttp {

   ServidorHttp servidor;
   String resultado = "";

   public AdministracionHttp(ServidorHttp servidor) {
      this.servidor = servidor;
   }

   public boolean procesar(HttpExchange arg) throws Exception {
      HttpRequest request = new HttpRequest(arg);
      String peticion = arg.getRequestURI().getPath().substring(21);
      if (request.query != null) {
         procesarComando(arg, request);
      } else if (peticion.equals("/") || peticion.equals("")) {
         enviarPagina(arg);
      } else if (peticion.equals("/contenido")) {
         enviarContenido(arg);
      }
      return true;
   }

   void enviarPagina(HttpExchange arg) throws Exception {
      GeneradorHtml html = Http.cargarHtmlJar("Administracion.html");
      String cont = html.toString();
      cont = cont.replaceAll("##001", arg.getLocalAddress().getHostName());
      cont = cont.replaceFirst("##resultado", resultado);
      arg.sendResponseHeaders(200, 0);
      Http.enviarTexto(arg, cont);
   }

   void procesarComando(HttpExchange arg, HttpRequest req) throws Exception {
      resultado = "";
      if (req.query.equalsIgnoreCase("volcarini")) {
         volcarIni(arg);
         Global.sleep(1000);
         enviarPagina(arg);
      } else if (req.query.equalsIgnoreCase("reiniciar")) {
         reiniciar(arg);
      } else if (req.query.equalsIgnoreCase("descargarlogs")) {
         descargarLogs(arg);
      } else if (req.query.equalsIgnoreCase("cargarIni")) {
         cargarIni(arg, req.getParameter("ini"));
      }
   }

   void enviarContenido(HttpExchange arg) throws Exception {
      GeneradorHtml html = new GeneradorHtml();
      html.insertBodyScript(" onload='document.body.scrollTop=9999999' ");
      html.abrirTag("font", "face='courier new' size=2");
      html.insert(resultado);
      html.cerrarTag();
      arg.sendResponseHeaders(200, 0);
      Http.enviarTexto(arg, html.toString());
   }

   void volcarIni(HttpExchange arg) throws Exception {
      BufferedReader bf = new BufferedReader(new FileReader("configuracionServidor.ini"));
      GeneradorHtml html = new GeneradorHtml();
      html.abrirTag("form", "action='/administracionRemota?cargarini' method=POST");
      html.abrirTag("textarea", "name='ini' cols='80' rows='25' WRAP=OFF");
      String linea;
      while ((linea = bf.readLine()) != null) {
         html.insert(linea + "\n");
      }
      bf.close();
      html.cerrarTag();
      html.insert("<br/>");
      html.insertTag("input", "type=submit value='  ENVIAR  '", "");
      html.cerrarTag();
      resultado = html.toString();
   }

   void reiniciar(HttpExchange arg) throws Exception {
      Http.enviarServidorNoDisponible(arg);
      servidor.stop();
      Global.main.reiniciar();
   }

   void descargarLogs(HttpExchange arg) throws Exception {
      GeneradorHtml html = new GeneradorHtml();
      listaLogs(html, "logConsola");
      html.add("");
      listaLogs(html, "logPing_");
      html.add("");
      listaLogs(html, "Forense_");
      resultado = html.toString();
      enviarPagina(arg);
   }

   void listaLogs(GeneradorHtml html, final String filtro) {
      File dirLogs = new File("logs");
      File[] logs = dirLogs.listFiles(new FilenameFilter() {
         @Override
         public boolean accept(File dir, String name) {
            return name.startsWith(filtro);
         }
      });
      Arrays.sort(logs, new ComparadorFechas());
      int n = Math.min(logs.length, 10);
      for (int i = 0; i < n; i++) {
         html.insertTag("a", "href='/logs/" + logs[i].getName() + "'", logs[i].getName()).add("");
      }
   }

   void cargarIni(HttpExchange arg, String contenido) throws Exception {
      if(contenido == null) return;
      PrintWriter pw = new PrintWriter(new FileOutputStream("configuracionServidor.ini", false));
      pw.print(contenido);
      pw.close();
      GestorColas.getGestor().autoMensaje(MensajeInterno.MSG_ACTUALIZAR_CONMUTADORES);
      volcarIni(arg);
      enviarContenido(arg);
   }

   class ComparadorFechas implements Comparator<File> {
      @Override
      public int compare(File f1, File f2) {
         return (int) (f2.lastModified() - f1.lastModified());
      }
   }
}
