#include <stdio.h>
#include <cstring>
#include "route.h"
#include "router.h"
#include "settings.h"
#include "sql.h"
#include "key.h"
#include "email.h"
#include "apn.h"
//#include "authServices.h"
#include <curlpp/cURLpp.hpp>
#include <curlpp/Easy.hpp>
#include <curlpp/Options.hpp>

using namespace curlpp::options;

#undef DEBUG


int main(int argc, char **argv, char **envp) {

	SQL sql;
	int i;
/*
	string media;
	for(i=0;i<2;i++) {
		sql.getRandomMediaLink(&media);
		cout << "link: " << media << endl;
	}
	exit(0);
*/

	string mime = "Content-Type: ";

	Route r;
	char** env;
	char *k, *v;
	Handler handler;
	SettingsLoader conf;
	router rtr;
	IDSet idSet;
	bool commandLine = false;

/*
	EMail email;

	email.test();
	exit(0);
*/

	// save the environment
	for (env = envp; *env != 0; env++) {
    	char* thisEnv = *env;
		k = thisEnv;
		v = strchr(thisEnv, '=');
		if(v!=NULL&&v!='\0') {
			*v='\0';
			v++;
		} else {
			continue;
		}
		r.addHeaderKey(k,v);
	
//		cout << k << " " << v << endl;
  	}

	//try {
		// Load configuraiton settings
		conf.loadSettings();
		sql.setSettings(&conf.settings);
		rtr.configRoutes(&r);

		// If we're invoked from the command line, set test parameters
		if(r.getHeaderValue("REQUEST_URI").size()==0) {

			commandLine=true;
			cout << "Running from command line..." << endl;
			//r.addHeaderKey("REQUEST_URI", "/svc/validate/email/erin@yahoo.com/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/default/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/0000009756F5A974B8F199CF00000000/");
			r.addHeaderKey("REQUEST_URI", "/svc/stream/0000009556ADC22FD3169DECFFFFFFFF/-1/20/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/updates/3d6e3f61-7695-45c7-8c58-a9b3efe08e12/-1/20/");
			//r.addHeaderKey("REQUEST_URI", "/svc/streams/fe669308-195b-46dc-853c-b1cdf959cafc/");
			//r.addHeaderKey("REQUEST_URI", "/svc/adserver/delta/1/");
			//r.addHeaderKey("REQUEST_URI", "/svc/urlblocker/delta/1/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/default/fe669308-195b-46dc-853c-b1cdf959cafc/");
			//r.addHeaderKey("REQUEST_URI", "http://api.zipzap.io/svc/stream/post/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/comment/0000009556C956D468330EDA00000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/comments/0000009556E2EE77D5653D4800000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/profile/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/media/0000009556ADC22FD3169DECFFFFFFFF/0000009556DD134CF55949E300000000/0/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/media/0000009556ADC22FD3169DECFFFFFFFF/000000000000000000000000000/1/");
			//r.addHeaderKey("REQUEST_URI", "/svc/media/0000009556DD19A94B81FD0700000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/post/0000009556D9173A7F04A95F00000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/iterate/rad/0000009556C956D468330EDA00000000/up/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/iterate/rad/0000009556C956D468330EDA00000000/down/");
			//r.addHeaderKey("REQUEST_URI", "/svc/report/url/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/privacy/0000009556ADC22FD3169DECFFFFFFFF/public/");
			//r.addHeaderKey("REQUEST_URI", "/svc/stream/users/search/");

			// Link Tests
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/request/0000009E5732D6605BBC369600000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/request/validate/00001B0757493D7038A358D8B3845746/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/request/reject/00000095574747FB5D0F057300000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/request/block/00000095574755A21FBCC90000000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/validated/list/00000095574747FB5D0F057300000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/waiting/list/00000095574747FB5D0F057300000000/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/waiting/list/default/");
			//r.addHeaderKey("REQUEST_URI", "/svc/friend/validated/list/default/");
			//r.addHeaderKey("REQUEST_URI", "/svc/contacts/invite/");

			// APN
			//r.addHeaderKey("REQUEST_URI", "/svc/apn/register/XYP/");

			r.addHeaderKey("REQUEST_METHOD", "GET");
			//r.addHeaderKey("REQUEST_METHOD", "PUT");
			//r.addHeaderKey("REQUEST_METHOD", "POST");
			//r.addHeaderKey("REQUEST_METHOD", "DELETE");
			r.addHeaderKey("SCRIPT_NAME", "/svc");
			r.addHeaderKey("HTTP_USERNAME", "jonathan");
			r.addHeaderKey("HTTP_PASSWORD", "Itadisbm1");
			//r.addHeaderKey("HTTP_USERNAME", "jack_az");
			//r.addHeaderKey("HTTP_PASSWORD", "Itadisbm1");
			cout << "Route is " << r.getHeaderValue("REQUEST_URI") << endl;
			cout << "User ID is " << sql.authenticate("jonathan", "Itadisbm1", "", &idSet) << endl;
		}

		// Gen handler for this route
		r.clear(&handler);
		handler.sql = &sql;
		handler.settings = &conf.settings;
		handler.router = &r;
		r.getHandler(r.getHeaderValue("REQUEST_URI"), r.getHeaderValue("REQUEST_METHOD"), &handler);

		// give the sql class visibility to the authenticated user information
		sql.handler = &handler;

		r.addHeaderKey("CONTENT_LENGTH", std::to_string(handler.postData.length()));

		// Just update default data
		if(commandLine) {
			APN apn;
			//apn.sendAlert(&conf.settings, &string("63c799113064680642b1fcf853135d045165644d629e73042b31051fff58d3b3"), &string("Alert"), 1, APN_FEATURED_BLOG, "blog12345");
			apn.sendAlert(&conf.settings, &string("4a4a36956332ddd0a6a60cf9d189874e2aa18d3d32be5ff2ed6d8ecd2d0e416e"), &string("Alert"), 1, APN_FEATURED_BLOG, "blog12345");
			exit(0);

//			sql.insertDefaultAccounts();
//			sql.changeDefaultAccountHeader();

			for(i=0; i<5; i++) {
				sql.postToDefaultAccounts(0.1);
			}

			//sql.changeDefaultAccountVerbiage();
			//sql.updateLocationDefaultAccounts();
			//exit(0);
		}

		// bail if we're not authenticated
		if(handler.authenticatedID==-1&&handler.visibility==AuthRequired) {
		} else {
			// Execute handler for this route
			handler.func(&handler);
		}

	//} catch(exception e) {
	//	handler.response = "main.c: Unknown Error";
	//}	

	// print out results
	cout << mime << handler.mime << endl << endl; 
	cout << handler.response << endl;

#ifdef DEBUG
	r.printHeaderInfo();
	sql.info();
	sql.testcpp();
	sql.testc();
	sql.addUser("Jonathan", "Rhoads", "jerhoads@yahoo.com", "M", "1975-12-30", "jonathan", "jr9377");
#endif
}
