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

import java.util.logging.Level;
import org.quickserver.net.server.ClientHandler;
import servidor.utiles.*;

public class Mensaje {

   String textoMensaje;
   String ip = "noIp";
   int codigo;
   protected String argumentos;
   public String[] params;
   ClientHandler handler;
   java.util.Date marcaTiempo;
   boolean ok = false;
   boolean urgente = false;
   public long indiceCola;

   public int getCodigo() {
      return codigo;
   }

   protected Mensaje() {
   }

   protected Mensaje(String comando, ClientHandler handler) {
      this.handler = handler;
      ip = handler == null ? "autoEnvio" : handler.getSocket().getInetAddress().toString();
      textoMensaje = comando;
      try {
         codigo = Integer.parseInt(comando.substring(0, 3));
         argumentos = comando.substring(3);
         params = servidor.utiles.Global.split(argumentos, '|');
         ok = true;
      } catch (Exception e) {
         servidor.ServidorMain.log.log(Level.WARNING, "Excepcion al procesar el mensaje ''{0}''", comando);
      }
   }

   public boolean esValido() {
      return ok;
   }

   public ClientHandler getHandler() {
      return handler;
   }

   public int numParams() {
      return params.length;
   }

   public int getIntParam(int idx) {
      try {
         if (idx < params.length) {
            return Integer.parseInt(params[idx]);
         } else {
            return -1;
         }
      } catch (Exception exc) {
         return -1;
      }
   }

   public String mensaje() {
      return textoMensaje;
   }

   @Override
   public String toString() {
      return Fecha.formatoHoraHMS(marcaTiempo) + "|" + textoMensaje;
   }

   public String toString2() {
      return String.format("%1$s %2$3d %3$s",Fecha.formatoHoraHMSm(marcaTiempo), codigo, argumentos);
   }

   public String toString3() {
      try {
         return String.format("%1$15s %2$7d %3$s %4$3d %5$s", ip,  indiceCola, Fecha.formatoHoraHMSm(marcaTiempo), codigo, argumentos);
      } catch(Exception exc) {
         return textoMensaje + " desde " + ip + "\nexc: " + exc.getMessage();
      }
   }
    public String toString4() {
      return Fecha.formatoHoraHMS(marcaTiempo) +"|" +ip+"|" +  argumentos;
   }

   public static final Mensaje nuevoMensaje(String str, ClientHandler handler) {
      if (str.length() > 2) {
         switch (str.charAt(0)) {
            case '0':
               return new MensajeOperador(str, handler);
            case '1':
               return new MensajeAdministrador(str, handler);
            case '2':
               return new MensajeMonitor(str, handler);
            //case '3': return new MensajeScripter(str, handler);  ELIMINADO POR AHORA ...
            case '4':
               return new MensajeGestor(str, handler);
            case '5':
               return new MensajeInterno(str, handler);
            case '8':
               return new MensajeCargador(str, handler);
            default:
               return null;
         }
      }
      return null;
   }

   public void procesar() {
   }
}

