/*\
title: $:/core/modules/commands/server.js
type: application/javascript
module-type: command

Serve tiddlers over http

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

exports.info = {
	name: "server",
	synchronous: true
};

var Command = function(params,commander,callback) {
	this.params = params;
	this.commander = commander;
	this.callback = callback;
};

Command.prototype.execute = function() {
	var self = this,
		util = require("util"),
		fs = require("fs"),
		url = require("url"),
		path = require("path"),
		http = require("http"),
		port = this.params[0] || "8080",
		rootTiddler = this.params[1] || "$:/core/templates/tiddlywiki5.template.html",
		renderType = this.params[2] || "text/plain",
		serveType = this.params[3] || "text/html";
	http.createServer(function(request, response) {
		var path = url.parse(request.url).pathname;
		switch(request.method) {
			case "PUT":
				var data = "";
				request.on("data",function(chunk) {
					data += chunk.toString();
				});
				request.on("end",function() {
					var title = decodeURIComponent(path.substr(1));
					self.commander.wiki.addTiddler(new $tw.Tiddler(JSON.parse(data),{title: title}));
					response.writeHead(204, "OK");
					response.end();
				});
				break;
			case "DELETE":
				self.commander.wiki.deleteTiddler(decodeURIComponent(path.substr(1)));
				response.writeHead(204, "OK");
				response.end();
				break;
			case "GET":
				if(path === "/") {
					response.writeHead(200, {"Content-Type": serveType});
					var text = self.commander.wiki.renderTiddler(renderType,rootTiddler);
					response.end(text, "utf8");	
				} else {
					response.writeHead(404);
					response.end();
				}
				break;
			}
	}).listen(port);
	if(this.commander.verbose) {
		console.log("Serving on port " + port);
	}
	return null;
};

exports.Command = Command;

})();
