/*
	【node.js】socket.ioで構築したローカルで動くシンプルなチャットルーム。みんなで書けるリモート版も公開中。
		http://www.tettori.net/post/852/
	Node + MongoDBでチャット的ななにかをつくる - Mongodbの導入、セッションを貼る、チャットロビーの作成まで
		http://atasatamatara.hatenablog.jp/entry/20120420/1334922757
*/

// ----------------------------------------------------------

var http = require("http");
var url = require('url');
var path = require('path');
var fs = require("fs");
var socketio = require("socket.io");
var mongoose = require('mongoose');
var mime=require('mime');

var member={};

// ----------------------------------------------------------

// MongoDB定義フェーズ
var Schema = mongoose.Schema;

var commentSchema = new Schema({
	message : { type:String, required: true },
	date : { type:Date, default: Date.now }
});

mongoose.model('Comment', commentSchema);

//http://muddy-dixon.appspot.com/ja/mongoosejs/model-definition.html
var db = mongoose.createConnection('mongodb://localhost/chat_db');
var Comment = db.model('Comment');

// ----------------------------------------------------------

//httpサーバー
var server = http.createServer(function(req, res) {
//GET
	var params = url.parse(req.url, true);
	for (var keyString in params) {
		if(keyString=="host"||keyString=="port"||keyString=="hostname"||keyString=="href"){
			if(keyString=="href"){
				var h=params[keyString];
				if(h.indexOf("//")==0){
					h=h.substring(1);
					params[keyString]=h;
					params.pathname=h.substring(0,h.indexOf("?"));;
				}
			}
			console.log("params "+keyString+" : "+params[keyString]);
		}
		else
			console.log("params "+keyString);
	}

	if(params.pathname=="/httpserv"){
console.log("***** "+params.query.mode);
		if(params.query.mode=="getdata"){
			Comment.find({}).sort({date:-1}).execFind( function(err, docs) {
				var st="";
				if(docs){
					for (var i=0, size=docs.length; i<size; ++i) {
						var msg=docs[i].message.split("\\'").join("'");
						var msg=docs[i].message.split("\\\"").join("\"");
						var dd=docs[i].date;
						st += "message: "+msg+" date: "+dd+ "<br> ";
						console.log(docs[i]);
					}
				}
				else st="No Data";
for (var keyString in member) {
console.log("●USER INFO "+keyString+":"+member[keyString]);
}				res.setHeader("Pragma","no-cache");
				res.setHeader("Expires","-1");
				res.writeHead(200, {'Content-Type': 'text/html; charset="UTF-8"'});
				res.end("<p>"+st+"</p>");
			});
		}
	}

/*
	else {
		res.writeHead(200, {"Content-Type":"text/html"});
		var output = fs.readFileSync("./index_socketio.html", "utf-8");
		res.end(output);
	}
*/
//要求ファイル(HTMLや画像など)の送信
	else{
		var filePath = url.parse(req.url).pathname;
		var fullPath = getRequestFilePath(filePath);
		var ext = path.extname(fullPath);
		if(ext=="")ext="index_socketio.html";
console.log("fullPath="+fullPath+" ext="+ext+".");

		path.exists(fullPath, function(exists) {
			if(exists){
				var contentType = mime.lookup(ext);
console.log("ctype="+contentType);
				if(contentType){
					var	statusCode = 200;
					var body = fs.readFileSync(fullPath);

// Check HTTP Method
					var method = req.method;
					if (method == "GET" || method == "POST") {
						res.setHeader("Pragma","no-cache");
						res.setHeader("Expires","-1");
						res.writeHead(statusCode, {
							'Content-Type': contentType,
							'Content-Length': body.length
						});
						res.write(body);
					}
					res.end();
				}
			}
		});
	}

}).listen(process.env.VMC_APP_PORT || 3002);



// Get Request File Path
var getRequestFilePath = function (filePath) {
//console.log("filePath="+filePath);
	var fullPath = path.join(__dirname,path.join(".\/", filePath));
	return fullPath;
};

// ----------------------------------------------------------

//socket.ioサーバー
var io = socketio.listen(server);

io.sockets.on("connection", function (socket) {

	if(!member[socket.id])member[socket.id]=socket.id;

// ブロードキャスト(送信者以外の全員に送信)
	socket.on("message", function (data) {
		var comment = new Comment();
			comment.message = data.message;
			comment.date = Date.now();
			comment.save( function(err, comment) {
				if (err) { console.log(err); }
			});
console.log('message:', comment.message);
		socket.broadcast.emit("message", {message:data.message});
	});

//切断イベント
	socket.on("disconnect", function () {
console.log("user disconnected "+socket.id);
		delete member[socket.id];
	});
});