import java.net.*;
import java.io.*;
import java.util.*;

//import Conexao;

public class Binder
{
  static ServerSocket ss;
  static Socket cs;
  static Conexao c;
  static Vector service_table = new Vector();
  static Vector monitores = new Vector();
  static GUI g;
  
  public Binder()
  {
    try
    {
      ss = new ServerSocket(5001);
      System.out.println("Binder no ar");
    }
    catch (Exception e)
    {
      System.out.println("Deu pau na criação do serverSocket do binder"+e.getMessage());
    }
  }
  
  static boolean connect()
  {
    boolean ret;
    try
    {
      cs = ss.accept();
      ret = true;
    }
    catch (Exception e)
    {
      System.out.println("Erro de connect..."+e.getMessage());
      ret = false;
    }
    return ret;
  }


  
  public static void main(String args[])
  {
    String msg;
    Binder b = new Binder();
    g = new GUI(service_table);
    g.setSize(400,100);
    g.setVisible(true);
    System.out.println("Criei a GUI");
    RefreshGUI RG = new RefreshGUI("gui", service_table,g);
    RG.start();
    while(1==1)
    {
      try
      {
        if (connect())
        {
          msg = c.receive(cs);
          // ser o primeiro campo for "0", significa que é um registro
          if (msg.substring(0,1).compareTo("0") == 0)
          {
            service_table.add(msg.substring(2));
            c.send(cs,"Ok");
            g.refresh(service_table);
            
            // crio o monitor para o servidor
            StringTokenizer linha = new StringTokenizer(msg.substring(2),"|");
            String nome = linha.nextToken();
            System.out.println(nome);
            String host = linha.nextToken();
            System.out.println(host);
            String porta = linha.nextToken();
            System.out.println(porta);
            String monitora = linha.nextToken();
            System.out.println(monitora);
            Monitor m = new Monitor(nome,host,Integer.parseInt(monitora),msg.substring(2),service_table);
            monitores.add(m);
            m.start();
          
            // imprimir a tabela
//            for (int i=0; i<service_table.size(); i++)
//               System.out.println(service_table.elementAt(i));
               
               
            
          }
          // se o primeiro campo for "1", significa que é uma consulta.
          else
          {
            System.out.println(msg);
        //    System.out.println("Pausa");
        //    System.out.println(consulta(msg));
            c.send(cs,consulta(msg));
          }
        }
      }
      catch(Exception e)
      {
        System.err.println(e.getMessage());
        System.out.println("deu pau na comunicação");
      }
    }
  }  
  
  public static String consulta(String msg)
  {
    // consulta a tabela de serviços para verificar se existe o serviço requisitado
    String aux;
    String service="Erro";
    int i=0;

    StringTokenizer linha = new StringTokenizer(msg,"|");
    aux = linha.nextToken();
    aux = linha.nextToken();

//    String aux = msg.substring(2,msg.length()-1);
    while ( i < service_table.size() )
    {
       service = (String)service_table.elementAt(i);
      
       if ( service.substring(0,service.indexOf("|",0)).compareTo(aux) == 0 )
       {
          i=service_table.size()+1; // para sair do laco
       }
       else
       {
          i++;
          service="Erro"; 
       }
    }
    System.out.println("Resp: "+service);
    return(service);
  }  
  
}