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

import org.quickserver.net.server.ClientHandler;
import org.quickserver.util.io.*;
import servidor.*;
import servidor.comunicaciones.*;
import servidor.utiles.Global;

public class Cliente {

   public static GestorColas gestor;
   ClientHandler handler;
   public String ipAdd;
   public int port;
   public boolean muerto = false;
   public boolean desconectado = false;
   public String tipo = "cliente";

   public Cliente(ClientHandler handler) {
      this.handler = handler;
      ipAdd = handler.getSocket().getInetAddress().toString().substring(1);
      port = handler.getSocket().getPort();
   }

   public String getIp() {
      return ipAdd + ":" + port;
   }

   public ClientHandler getHandler() {
      return handler;
   }

   public void cerrarConexion() {
      System.out.println("Cerrada conexion cliente: " + handler);
   }

   public boolean enviaMensaje(int codigo, String texto) {
      if (desconectado) {
         return false;
      }
      try {
         envia(Global.formateaCodigo(codigo) + texto);
         return true;
      } catch (Exception exc) {
         String txt = texto.substring(0, (texto.length() >= 80 ? 80 : texto.length()));
         System.out.println("No se entrego el mensaje al cliente " + getIp() + "\nMensaje: " + codigo + "-" + txt);
      }
      return false;
   }

   public boolean enviaBuffer(String bufer) {
      if (desconectado) {
         return false;
      }
      try {
         envia(bufer);
         return true;
      } catch (Exception exc) {
         String txt = bufer.substring(0, (bufer.length() >= 20 ? 20 : bufer.length()));
         System.out.println("No se entrego el bufer al cliente " + getIp() + "\nCominezo: " + txt);
      }
      return false;
   }

   private synchronized void envia(String texto) throws Exception {
      try {
         long tAntes = System.currentTimeMillis();
         handler.sendClientMsg(texto);
         long tDespues = System.currentTimeMillis();
         long transcurrido = tDespues - tAntes;
         if(transcurrido > 10000 && Configuracion.getConfiguracion().modoDepuracion) {
            String msj = String.format("El envio del mensaje\n%1$s -> %2$s\nnecesitó %3$d mseg.", texto,
                    handler.getSocket().getInetAddress().toString(), transcurrido);
            ServidorMain.log.warning(msj);
         }
      } catch (java.net.SocketException exc) {
         if (exc.getMessage().startsWith("Connection is no more open")) {
            desconectado = true;
         } else {
            throw exc;
         }
      } catch (java.lang.IllegalStateException exc) {
         throw exc;
      }
   }

   public boolean enviaMensajeUrgente(int codigo, String texto) {
      try {
         handler.sendClientMsg(Global.formateaCodigo(codigo) + texto);
         return true;
      } catch (Exception exc) {
         exc.printStackTrace();
      }
      return false;
   }
   
   public void datosBinarios(byte[] data) {}

   public void enviaMensaje(int codigo, Object... vars ) {
      StringBuilder sb = new StringBuilder();
      for(int i=0;i<vars.length;i++) {
         sb.append(vars[i].toString());
         if(i+1 < vars.length) sb.append('|');
      }
      enviaMensaje(codigo, sb.toString());
   }

   public void aviso(int codigo, String txt) {
   }
}
