#include <Skylark/Skylark.h>
#include <CtrlLib/CtrlLib.h>

using namespace Upp;

struct GuiApp : TopWindow {
	typedef GuiApp CLASSNAME;
	GuiApp();
	void Message(const String& s){Title(s);}
};

GuiApp& GlobalGui();

SKYLARK(HomePage, "")
{
	PostCallback(callback1(&GlobalGui(), &GuiApp::Message, "Homepage"));
	http << "<html><body>Hello world!</body></html>";
}

SKYLARK(Param, "*/param")
{
	PostCallback(callback1(&GlobalGui(), &GuiApp::Message, "Parameter: "+http[0]));
	http << "<html><body>Parameter: " << http[0] << "</html></body>";
}

SKYLARK(Params, "params/**")
{
	http << "<html><body>";
	String params("Parameters: ");
	for(int i = 0; i < http.GetParamCount(); i++){
		params += http[i] + " ";
	}
	PostCallback(callback1(&GlobalGui(), &GuiApp::Message, params));
	http << params << "</html></body>";
}

SKYLARK(CatchAll, "**")
{
	http.Redirect(HomePage);
}

SKYLARK(Favicon, "/favicon.ico")
{
	http.ContentType("image/png") << LoadFile(GetDataFile("favicon.png"));
}

struct MyApp : SkylarkApp {
	MyApp() {
		root = "";
	#ifdef _DEBUG
		prefork = 0;
		use_caching = false;
	#endif
	}
};

void SkylarkMain()
{
#ifdef _DEBUG
	StdLogSetup(LOG_FILE|LOG_COUT);
	Ini::skylark_log = true;
#endif
	MyApp().Run();	
}

GuiApp::GuiApp(){
	Sizeable().Title("test").SetRect(0,0,200,100);
	Thread::Start(callback(&SkylarkApp::TheApp(), &MyApp::Run));
}

GuiApp& GlobalGui(){
	static GuiApp app;
	return app;
}

GUI_APP_MAIN
{
	MyApp app;
	GlobalGui().Run();
}
