/* 
* 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.net.*;
import java.text.*;
import java.util.*;
import servidor.Configuracion;
import servidor.comunicaciones.*;
import servidor.utiles.*;

public class ServidorHttp {

   HttpServer server;
   public static ServidorHttp servidorHttp;
   ConsolaHttp consola;
   AdministracionHttp administracion;

   public ServidorHttp() {
      try {
         server = HttpServer.create();
         InetSocketAddress isa = new InetSocketAddress(java.net.InetAddress.getLocalHost().getHostAddress(), Configuracion.getConfiguracion().ipPort + 1000);
         server.bind(isa, 3);
         servidorHttp = this;
         HttpContext contexto = server.createContext("/", manejadorHttp);
         contexto.setAuthenticator(autentificador);
         consola = new ConsolaHttp(this);
         administracion = new AdministracionHttp(this);
      } catch (Exception exc) {
         server = null;
      }
   }

   public void start() {
      try {
         if (server != null) {
            server.start();
         }
      } catch (Exception exc) {
         exc.printStackTrace();
      }
   }

   public void stop() {
      try {
         server.stop(0);
      } catch (Exception exc) {
         exc.printStackTrace();
      }
   }
   
   HttpHandler manejadorHttp = new HttpHandler() {
      @Override
      public void handle(HttpExchange arg) throws java.io.IOException {
         try {
            arg.getRequestBody();
            arg.getResponseHeaders().set("Server","AEAT-Ateneo/2.0");
            String peticion = arg.getRequestURI().getPath().substring(1);
            String lPeticion = peticion.toLowerCase();
            if(lPeticion.equals("") || peticion.equals("index.html")) {
               paginaInicial(arg);
            } else if (lPeticion.startsWith("administracionremota")) {
               administracion.procesar(arg);
            } else if (lPeticion.startsWith("consolaremota")) {
               consola.procesar(arg);
            } else if (lPeticion.startsWith("recursos")) {
               Http.enviarArchivoJar(arg, peticion);
            } else if (lPeticion.startsWith("logs")) {
               Http.enviarArchivo(arg, peticion);
            }
         } catch(Exception exc) {
            //exc.printStackTrace();
         }
         arg.close();
      }     
   };
   
   BasicAuthenticator autentificador = new BasicAuthenticator("AteneoHttp") {
      @Override
      public boolean checkCredentials(String nombre, String password) {
         servidor.Configuracion conf = servidor.Configuracion.getConfiguracion();
            return conf.usuariosAutorizados.contains(nombre + ":" + password);
      }
   };
   
   void paginaInicial(HttpExchange arg) throws Exception {
      DecimalFormat dcf = new DecimalFormat("###,###,###");
      long memTotal = Runtime.getRuntime().totalMemory();
      long memOcupada = memTotal - Runtime.getRuntime().freeMemory();
      GeneradorHtml html = Http.cargarHtmlJar("index.html");
      String[] datos = GestorColas.getGestor().obtenerEstado();
      html.add(Global.main.getConsola().getTitle());
      html.add("corriendo en " + System.getProperty("java.vm.name") + " " + System.getProperty("java.version"));
      html.add("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memoria total:   " + dcf.format(memTotal / 1024) + " K\n");
      html.add("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memoria ocupada: " + dcf.format(memOcupada / 1024) + " K\n");
      html.add("ESTADO DEL SERVIDOR:");
      html.add("Modo:               " + datos[0]);
      html.add("Comprob. monitores: " + datos[1]);
      html.add("Recepcionista:      " + datos[2]);
      html.add("Presentes:          " + datos[3]);
      html.add("Operadores:         " + datos[4]);
      html.add("TURNO:              " + datos[5]);
      html.add("Prioridad Cita P.   " + datos[6]);
      html.add("Gestión huecos:     " + datos[7]);     
      html.add("Base de Datos en :  " + datos[8]);
      if(datos[9].equals("RECUP SI")) {
         html.add("* ACTIVADO MODO RECUPERACION SQLSERVER * ");
      }
      String cont = html.toString();
      cont = cont.replaceAll("##001", arg.getLocalAddress().getHostName());
      cont = cont.replaceAll("##002", Fecha.formatoHoraHMS(new Date()));
      arg.sendResponseHeaders(200, 0);
      Http.enviarTexto(arg, cont);
   }
}
