/* 
* 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.net.*;
import servidor.utiles.*;

/**
 *
 * @author admf11600q4
 */
public class BroadcastServidor implements Runnable {
   boolean ok;
   String ip;
   Thread hilo;
   
   public BroadcastServidor() { 
      try {
         InetAddress ie = InetAddress.getLocalHost();
         ip = ie.getHostAddress();
         ok = true;
      } catch(Exception exc) {
         ok = false;
      }
   }
   
   public String ipEncontrada = "";
   
   public boolean existeAnterior(String nombre) {
      byte[] buf = new byte[1000];
      byte[] broadCastAddress = new byte[] { (byte)255, (byte)255,(byte)255,(byte)255};
      try {
         DatagramPacket paquete = new DatagramPacket(buf, buf.length);
         paquete.setPort(servidor.Configuracion.getConfiguracion().ipPort);
         paquete.setAddress( InetAddress.getByAddress(broadCastAddress));
         paquete.setData("buscaServidor".getBytes());
         DatagramSocket udp = new DatagramSocket();
         udp.send(paquete);
         udp.setSoTimeout(3000);
         paquete = new DatagramPacket(buf, buf.length);
         udp.receive(paquete);
         String resp = new String(paquete.getData(), 0, paquete.getLength());
         String[] partes = Global.split(resp, ' ');
         if(partes[0].equals("ServidorAteneo") && partes[1].equals(nombre)) {    
            ipEncontrada = partes[2];
            return true;
         }         
         udp.close();
         udp = null;
      } catch(Exception exc) {
      }
      return false;
   }
   
   public void iniciar() {
      if(!ok) return;
      hilo = new Thread(this);
      hilo.start();
   }

   @Override
   public void run() {
      DatagramSocket socket = null;
      try {
         socket = new DatagramSocket(servidor.Configuracion.getConfiguracion().ipPort);
      } catch(Exception exc) {
         ok = false;
         return;
      }
      byte[] contestacion = ("ServidorAteneo " + servidor.Configuracion.getConfiguracion().nombreServidor + " " + ip).getBytes();
      byte[] bufer = new byte[200];
      DatagramPacket paquete = new DatagramPacket(bufer, bufer.length);
      while(true) {
         try {
            socket.receive(paquete);
            InetAddress direccion = paquete.getAddress();
            int puerto = paquete.getPort();
            String msg = new String(paquete.getData(), 0, paquete.getLength());
            if(msg.startsWith("buscaServidor")) {               
               DatagramPacket envio = new DatagramPacket(contestacion, contestacion.length);
               envio.setAddress(direccion);
               envio.setPort(puerto);
               socket.send(envio);
            }
         } catch(Exception exc) {
            String msg = exc.getMessage();
         }         
      }
   }

}
