/****************************************************************************
*  XARXES DE COMPUTADORS II                                                 
*
*  Practica VoIP
*
*  Realizado por: 
*     Francisco Jose Aguilar Celdran
*     Sergio Blanco Cuaresma
*
*  clienttest.c: 
*     Test de funciones del servidor. 
****************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/param.h>
#include <sys/socket.h>
#include <malloc.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include "cola.h"
#include "libclient.h"


/* ------------------- */
/* PROGRAMA PRINCIPAL  */
/* ------------------- */

int main (int argc, char **argv)
{
   int sock, i;
   unsigned int puerto;
   char *nombre_servidor, error[255];
   struct sockaddr_in dir_socket_servidor;   // estructura:puerto,@IP,protocolo
   UserPort userFound, *userFound_ptr;
   Cola *cola = NULL;
   
   // Obtencion del parametro 'host servidor' y 'puerto'

   if (argc != 3) {
      fprintf(stderr,"Sintaxis: clientetest host_servidor puerto \n");
      fprintf(stderr,"\t (puerto: valor entre 0 y 65635) \n");
      exit(-1);
   } else {
      nombre_servidor = argv[1];
      puerto = atoi((char *)argv[2]);
   }
   
   // Creacion del socket
   crear_socket(nombre_servidor, puerto, &sock, &dir_socket_servidor);
   
   cola = (Cola *)crear_cola();
   GetList(sock, dir_socket_servidor, "sergio@luna", "root@localhost", cola);
   printf("Usuarios iniciales en el servidor: %i\n",cola->total);
   
   Register(sock, dir_socket_servidor, "sergio@luna", "root@localhost", "2000", error);
   Register(sock, dir_socket_servidor, "sergio@luna", "root@localhost", "2000", error);
   printf("Intentando registrarme por segunda vez => Error? %s", error);
   
   //Register(sock, dir_socket_servidor, "pepe@jupiter", "root@localhost", "9393", error);
   
   Whereis(sock, dir_socket_servidor, "sergio@luna", "root@localhost",  "sergio@luna", &userFound);
   printf("Buscando usuario que existe => Found: %s - %s\n", userFound.user, userFound.port);
   
   int errorCode = Whereis(sock, dir_socket_servidor, "sergio@luna", "root@localhost",  "billgates@luna", &userFound);
   if (errorCode == 1) {
      printf("Buscando usuario que no existe => Bill gates not found!\n");
   }
   
   GetList(sock, dir_socket_servidor, "sergio@luna", "root@localhost", cola);
   
   reiniciar_PDI(cola);
   printf("Online:\n");
   for (i=0; i<cola->total; i++) {
      userFound_ptr = (UserPort *)obtener_elemento_PDI(cola);
      printf("%s - %s\n", userFound_ptr->user, userFound_ptr->port);
      avanzar_PDI(cola);
   }
   vaciar_cola(cola);
   
   Unregister(sock, dir_socket_servidor, "sergio@luna", "root@localhost");
   
   
   // Cerramos sockets
   if ((close(sock))==-1) { 
      fprintf(stderr, "Error Cliente:close"); 
      perror((char *)close); 
   }
   
   exit(0);
}


