#include <stdio.h> 
#include <stdlib.h> 
#include <errno.h> 
#include <string.h> 
#include <netdb.h> 
#include <sys/types.h> 
#include <netinet/in.h> 
#include <sys/socket.h> 
#include <unistd.h>
#include "client.h"
#include "config.h"
#include "netutils.h"

void process_client_params(int argc, char *argv[]);
void print_usage();


int main(int argc, char *argv[])
{
  struct sockaddr_in their_addr;

  /* Process arguments */
  process_client_params(argc, argv);

  // set up client stuff (socket, etc)
  their_addr = open_client(config.hostname, config.server_port);

  // start send request/ receive response loop
  client_request_loop(their_addr, config.request_size, config.number_of_messages);
  
  return 0;
}


void process_client_params(int argc, char *argv[])
{
  int i = 1;

  strcpy(config.names_file, "names.dat");
  config.client_port = DEFAULT_CLIENT_PORT;
  config.server_port = DEFAULT_SERVER_PORT;

  // process options
  while(i < argc && argv[i][0] == '-') {

    if (strcmp("-verbose_debug", argv[i]) == 0) {
      config.terse_debug = TRUE;
      config.verbose_debug = TRUE;
    } else if (strcmp("-terse_debug", argv[i]) == 0 ||
	       strcmp("-debug", argv[i]) == 0) {
      config.terse_debug = TRUE;
    } else if (strcmp("-sending_verbose_stats", argv[i]) == 0) {
      config.sending_verbose_stats = TRUE;
    } else if (strcmp("-receiving_verbose_stats", argv[i]) == 0) {
      config.receiving_verbose_stats = TRUE;
    } else if (strcmp("-req_resp_verbose_stats", argv[i]) == 0) {
      config.req_resp_verbose_stats = TRUE;
    } else if (strcmp("-use_DNS", argv[i]) == 0) {
      config.use_DNS = TRUE;
    } else if (strcmp("-cport", argv[i]) == 0) {
      i++;
      config.client_port = atoi(argv[i]);
    } else if (strcmp("-sport", argv[i]) == 0) {
      i++;
      config.server_port = atoi(argv[i]);
    } else {
      fprintf(stderr, "unknown argument: %s\n\n", argv[i]);
      print_usage();
    }
    i++;
  }
  

  // process mandatory arguments
  if (i != argc-3) {
    print_usage();
  }

  if (argv[i][0] == '-') {
    print_usage();
  }
  config.hostname = argv[i++];

  if (argv[i][0] == '-') {
    print_usage();
  }
  config.request_size = atoi(argv[i++]);

  if (argv[i][0] == '-') {
    print_usage();
  }
  config.number_of_messages = atoi(argv[i]);

  if (config.terse_debug) {
    fprintf(stderr, "terse_debug:             %d\n", config.terse_debug);
    fprintf(stderr, "verbose_debug:           %d\n", config.verbose_debug);
    fprintf(stderr, "sending_verbose_stats:   %d\n", config.sending_verbose_stats);
    fprintf(stderr, "receiving_verbose_stats: %d\n", config.receiving_verbose_stats);
    fprintf(stderr, "req_resp_verbose_stats:  %d\n", config.req_resp_verbose_stats);
    fprintf(stderr, "use_DNS                  %d\n", config.use_DNS);
    fprintf(stderr, "cport                    %d\n", config.client_port);
    fprintf(stderr, "sport                    %d\n", config.server_port);
    if (config.use_DNS) {
      fprintf(stderr, "DNS file name:           %s\n", config.names_file);
    }
    fprintf(stderr, "hostname:                %s\n", config.hostname);
    fprintf(stderr, "request_size:            %d\n", config.request_size);
    fprintf(stderr, "number_of_messages:      %d\n", config.number_of_messages);
  }

}

void print_usage()
{

  fprintf(stderr,"usage: client [options] hostname request_size number_of_messages\n\n");

  fprintf(stderr, "options:\n");
  fprintf(stderr, "\t%-40sDebug with lots of output\n", "-verbose_debug");
  fprintf(stderr, "\t%-40sDebug with less output\n", "-debug, terse_debug");
  fprintf(stderr, "\t%-40sPrint all sending times\n", "-sending_verbose_stats");
  fprintf(stderr, "\t%-40sPrint all receiving times\n", "-receiving_verbose_stats");
  fprintf(stderr, "\t%-40sPrint all request->response times\n", "-req_resp_verbose_stats");
  fprintf(stderr, "\t%-40sUse DNS instead of translation via 'names.dat'\n", "-use_DNS");
  fprintf(stderr, "\t%-40sBind client to specified port (default is 0xfaaf)\n", "-cport <port_number>");
  fprintf(stderr, "\t%-40sServer port to use (default is 0xdeed)\n", "-sport <port_number>");
  fprintf(stderr,"\n'0' for number_of_messages will send requests forever\n\n");
  exit(1);
}











