/* 
* 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.*;
import java.util.logging.Level;
import servidor.ServidorMain;
import servidor.clientes.*;
import servidor.datos.base.*;
import servidor.utiles.*;

public class GestorEnviosMasivos {

   public GestorEnviosMasivos() {
   }

   public void enviarTablaCandidatos(Cliente cliente) {
      ArrayList<MemRegistro> tabla = GestorColas.getGestor().tablaCandidatos.registros();
      try {
         cliente.getHandler().sendClientMsg(Global.formateaCodigo(Gestor.MSG_NUMERO_CANDIDATOS) + tabla.size());
      } catch (Exception exc) {
         ServidorMain.log.log(Level.WARNING, "No se pudo enviar MSG NUMERO CANDIDATOS al Cliente: {0}", exc.getMessage());
      }
      ThreadEnvioTabla hilo = new ThreadEnvioTabla(tabla, "candidatos", cliente, Gestor.MSG_REGISTRO_CANDIDATOS);
      hilo.start();
   }

   public void enviarTablaHuecos(Cliente cliente) {
      ArrayList<MemRegistro> tabla = GestorColas.getGestor().tablaHuecos.registros();
      ThreadEnvioTabla hilo = new ThreadEnvioTabla(tabla, "huecos", cliente, Gestor.MSG_REGISTRO_HUECOS);
      hilo.mensajeFinal = "FIN_REGISTROS";
      hilo.start();
   }

   public void enviarTablaColas(Cliente cliente) {
      ArrayList<MemRegistro> tabla = GestorColas.getGestor().tablaColas.registros();
      ThreadEnvioTabla hilo = new ThreadEnvioTabla(tabla, "colas", cliente, Gestor.MSG_REGISTRO_COLAS);
      hilo.mensajeFinal = "FIN_REGISTROS";
      hilo.start();
   }

   public void enviarTablaOperadores(Cliente cliente) {
      ArrayList<MemRegistro> tabla = GestorColas.getGestor().tablaOperadores.registros();
      ThreadEnvioTabla hilo = new ThreadEnvioTabla(tabla, "operadores", cliente, Administrador.MSG_ENVIO_REGISTRO_OPERADORES);
      hilo.start();
   }

   public void enviarTablaCodEstadisticos(Cliente cliente) {
      ArrayList<MemRegistro> tabla = GestorColas.getGestor().tablaCategorias.registros();
      ThreadEnvioTabla hilo = new ThreadEnvioTabla(tabla, "operadores", cliente, Operador.MSG_CATEGORIA_ESTADISTICA);
      hilo.mensajeFinal = "FIN_REGISTROS";
      hilo.start();
   }

   class ThreadEnvioTabla extends Thread {

      ArrayList<MemRegistro> tabla;
      Cliente cliente;
      int codigo;
      String nombreTabla;
      int ultimo;
      public String mensajeFinal = null;

      ThreadEnvioTabla(ArrayList<MemRegistro> tabla, String nombreTabla, Cliente cliente, int codMensaje) {
         this.tabla = tabla;
         this.cliente = cliente;
         this.nombreTabla = nombreTabla;
         codigo = codMensaje;
         ultimo = tabla.size();
      }

      @Override
      public void run() {
         String cod = Global.formateaCodigo(codigo);
         int ult = 0;
         try {
            while (ult < ultimo) {
               int prim = ult;
               ult += 20;
               if (ult > ultimo) {
                  ult = ultimo;
               }
               StringBuilder sb = new StringBuilder(20 * 300);
               for (int i = prim; i < ult; i++) {
                  sb.append(cod).append((tabla.get(i)).registroSBuff()).append("\n");
               }
               sb.setLength(sb.length() - 1);
               if (!cliente.enviaBuffer(sb.toString())) {
                  cliente.aviso(codigo, "Transferencia abortada");
                  if (!cliente.desconectado) {
                     throw new Exception("");
                  }
               }
            }
            if (mensajeFinal != null) {
               cliente.enviaMensaje(codigo, mensajeFinal);
            }
            cliente.aviso(codigo, "Transferencia terminada");
         } catch (Exception exc) {
            System.out.println("  No se pudo enviar la tabla " + nombreTabla + " a " + cliente.tipo + " " + cliente.ipAdd);
            System.out.println("  Probablemente desconectó antes de concluir la transmisión");
         }
      }
   }
}
