#include <stdio.h>
#include <stdlib.h>

#include "Logger.h"
#include "HttpUrl.h"
#include "TimeServer.h"

void printUsage(const char *program_name)
{
	printf("Usage: \n"
		   "%s <host[:port]> \n"
		   "   host = web server hostname or ip address\n"
		   "   port = port number (default %d)\n"
		   "   [at max %d servers are supported]\n\n", program_name, DEFAULT_HTTP_PORT, MAX_TIME_SERVERS);
}

int main(int argc, char **argv)
{
	if ( argc <= 1 )
	{
		printUsage(argv[0]);
		exit(1);
	}

	/* build servers list from CLI args */
	TimeServers servers;
	int arg_idx;
	for ( arg_idx=1, servers.count=0; arg_idx<argc && servers.count<MAX_TIME_SERVERS; arg_idx++ )
	{
		/* initiate the TimeServer as requested in TimeServer.h! */
		initTimeServer(&servers.server[servers.count]);
		/* initiate the URL to use for this TimeServer */
		buildHttpUrl(&servers.server[servers.count].url, argv[arg_idx]);
		/* increase the TimeServers counter */
		servers.count++;
	}

	/* create a clock simulation object */
	Clock clock;
	initClock(&clock);

	/* we need this for statistical things later */
	double offsets_sum = 0.0;

	/* ask every server for its time */
	int idx;
	for ( idx=0; idx<servers.count; idx++ )
	{
		TimeServer *server = &servers.server[idx];
		double offset = server->getOffset(server, &clock);

		offsets_sum  += offset;
		
		logDebug("Calculated offset: {%s} %.2f\n", server->url.domain, offset);
	}

	/* get average of received timestamps */
	/* we could also calculate median or similar here */
	double offsets_average = (offsets_sum/(double)servers.count);

	/* adjust the clock (smoothly) */
	clock.adjust(&clock, offsets_average);

	return 0;
}

