/****************************************************************************
*  XARXES DE COMPUTADORS II                                                 
*
*  Practica VoIP
*
*  Realizado por: 
*     Francisco Jose Aguilar Celdran
*     Sergio Blanco Cuaresma
*
*  callbacks.c: 
*     Implementación de todos los controladores de las señales de la 
*     interficie.
****************************************************************************/
#include <gtk/gtk.h>
#include "cola.h"
#include "libclient.h"
#include "interface.h"
#include "phone.h"

/**
   COLUMNAS del listado (GtkTreeView)
**/
enum columns {
   USER_COLUMN,
   MACHINE_COLUMN,
   PORT_COLUMN,
   N_COLUMNS
};

/**
   Botón listar pulsado, solo es posible si se esta registrado y no se esta
   llamando o hablando.
**/
void on_listar_btn_clicked (GtkButton* button, gpointer func_data) {
   Cola *cola = (Cola *)crear_cola();
   
   GetList(serverSock, dir_serverSock, miFrom, toServer, cola);
   listar(cola);
   vaciar_cola(cola);
}


/**
   Botón llamar pulsado, solo es posible si hay otro usuario selecionado en
   el listado.
**/
void on_llamar_btn_clicked (GtkButton* button, gpointer func_data) {
   char *toCliente = construir_direccion(usuario_actual, maquina_actual);
   estado = LLAMANDO;

   if (llamadaSock == -1) {
      close(llamadaSock);
   }
   crear_socket(maquina_actual, atoi(puerto_actual), &llamadaSock, &dir_llamadaSock);
   int result = Invite(llamadaSock, dir_llamadaSock, miFrom, toCliente, callid);
   if (result == 1) {
      //busy
      avisar(_("El usuario esta ocupado."));
      estado = REGISTRADO;
   } else if (result == 2) {
      //Refused
      avisar(_("El usuario ha rechazado su llamada."));
      estado = REGISTRADO;
   } else {
      //Accepted
      
      // LLAMAR
      llamar(maquina_actual);

      estado = HABLANDO;
      visualizar_estado(estado);
      
   }
}

/**
   Botón registrar pulsado, solo es posible si esta deregistrado
**/
void on_registrar_btn_clicked (GtkButton* button, gpointer func_data) {
   char error[255];
   if (Register(serverSock, dir_serverSock, miFrom, toServer, puerto_local, error) == 1) {
      avisar(_(error));
   } else {
      estado = REGISTRADO;
      visualizar_estado(estado);
   }
}


/**
   Botón deregistrar pulsado, solo es posible si esta registrado y no esta
   llamando o hablando.
**/
void on_deregistrar_btn_clicked (GtkButton* button, gpointer func_data) {
   Unregister(serverSock, dir_serverSock, miFrom, toServer);
   estado = DEREGISTRADO;
   visualizar_estado(estado);
}

/**
   Botón buscar pulsado, solo es posible si hay otro usuario selecionado en
   el listado.
**/
void on_buscar_btn_clicked (GtkButton* button, gpointer func_data) {
   UserPort encontrado;
   char *buscarUsuario = pedir("Nombre de usuario a buscar:");
   
   if (Whereis(serverSock, dir_serverSock, miFrom, toServer, buscarUsuario, &encontrado) == 1){
      avisar(_("El usuario no esta registrado"));
   } else {
      Cola *cola = (Cola *)crear_cola();
      encolar(cola, (void *)&encontrado);
      listar(cola);
      vaciar_cola(cola);
   }
}

/**
   Botón colgar pulsado, solo es posible si esta hablando
**/
void on_colgar_btn_clicked (GtkButton* button, gpointer func_data) {
   colgar(ORIGINAMOS);
   estado = REGISTRADO;
   visualizar_estado(estado);
}

/**
   Botón salir pulsado, siempre es posible
**/
void on_salir_btn_clicked (GtkButton* button, gpointer func_data) {
   if (estado == HABLANDO) {
      colgar(ORIGINAMOS);
      estado = REGISTRADO;
   }
   if (estado != DEREGISTRADO) {
      Unregister(serverSock, dir_serverSock, miFrom, toServer);
   }
   gtk_main_quit();
}

/**
   Ventana cerrada, siempre es posible
**/
void on_mainWin_destroy (GtkWindow* win, gpointer func_data) {
   if (estado == HABLANDO) {
      colgar(ORIGINAMOS);
      estado = REGISTRADO;
   }
   if (estado != DEREGISTRADO) {
      Unregister(serverSock, dir_serverSock, miFrom, toServer);
   }
   gtk_main_quit();
}

/**
   Seleccionado una nueva fila en el listado (GtkTreeView)
**/
void on_listado_selection_change (GtkTreeSelection *selection, gpointer data) {
   GtkTreeIter iter;
   GtkTreeModel *model;
   
   if (gtk_tree_selection_get_selected (selection, &model, &iter)) {
      if (usuario_actual != NULL) {
         g_free (usuario_actual);
         g_free (maquina_actual);
         g_free (puerto_actual);
      }
      gtk_tree_model_get (model, &iter, USER_COLUMN, &usuario_actual, -1);
      gtk_tree_model_get (model, &iter, MACHINE_COLUMN, &maquina_actual, -1);
      gtk_tree_model_get (model, &iter, PORT_COLUMN, &puerto_actual, -1);
      
      if (estado != DEREGISTRADO) {
         gtk_widget_set_sensitive(GTK_WIDGET(llamar_btn), TRUE);
      }
   }
}


/**
   Boton aceptar del dialogo especial buscarDialog pulsado
**/
void on_buscarDialog_response (GtkButton* button, gpointer func_data) {   
   gtk_widget_hide(GTK_WIDGET(buscarDialog));
}

/**
   Dialogo especial buscarDialog cerrado
**/
void on_buscarDialog_close (GtkButton* button, gpointer func_data) {
   gtk_widget_hide(GTK_WIDGET(buscarDialog));
}

