#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include "u-hashtable.h"

/*initialize */
USER_STRUCT *users = NULL;

/*add user information */
void uadd_user(uint32_t user_ip, USER user_info)
{
  USER_STRUCT *s ;
  HASH_FIND_INT(users, &user_ip, s);  /*ip already in the hash? */
  if(s == NULL)
  {
    s = (struct user_struct *)malloc(sizeof *s);
    s->ip = user_ip;
    HASH_ADD_INT(users, ip, s);
  }
    
  s->info = user_info;
}

/*find user information */
USER_STRUCT *ufind_user(uint32_t user_ip)
{
  USER_STRUCT *s;
  HASH_FIND_INT(users, &user_ip, s);
  printf("user_nams: %s  user_id:%d usergroud_id:%d\n", s->info.name, s->info.user_id, s->info.usergroud_id);
  return s;
}

/*delete user information */
void udelete_user(USER_STRUCT *user)
{
  HASH_DEL(users, user);     /* user: pointer to delete */
  free(user);
}

/*delect all uesr'informations */
void udelete_all()
{
  USER_STRUCT *current_user, *tmp;
  HASH_ITER(hh, users, current_user, tmp)
  {
    HASH_DEL(users,current_user);   /* delete; users advances to next */
    free(current_user);
  }
}

/*printf user information */
void uprint_users()
{
  USER_STRUCT *s;
  char str[32];
  for(s=users; s != NULL; s=(USER_STRUCT *)(s->hh.next))
  {
    inet_ntop(AF_INET, (void *)&s->ip, str, 32);
    printf(" user_ip: %s user_nams: %s  user_id:%d usergroud_id:%d\n", str, s->info.name, s->info.user_id, s->info.usergroud_id);
  }
}