/*
	【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 fs = require("fs");
var WebSocketServer = require('ws').Server;
var mongoose = require('mongoose');

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);

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+".");
	}

for (var key in req.headers)console.log("req.headers:"+key+":"+req.headers[key]);

	if(params.pathname=="/httpserv"){
console.log("***** "+params.query.mode);
		if(params.query.mode=="getdata"){
//			Comment.find( {}, function(err, docs) {
			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("<>"+st+"</p>");
			});
		}
	}

	else {
console.log("./index_websocket.html");
		res.writeHead(200, {"Content-Type":"text/html"});
		var output = fs.readFileSync("./index_websocket.html", "utf-8");
		res.end(output);
	}
}).listen(process.env.VMC_APP_PORT || 3001);

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

//websocketサーバー
var WebSocketServer = require('ws').Server;

var wss = new WebSocketServer({server:server});

//Websocket接続情報を保存
var connections = [];

//接続時
wss.on('connection', function (ws) {

//for (var key in ws)console.log("ws "+key+":"+ws[key]);
	connections.push(ws); //WebSocket接続情報の保存

//受信メッセージのブロードキャスト
	ws.on('message', function (data) {
		data=JSON.parse(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);
		broadcast(JSON.stringify(comment.message));
	});

//切断イベント
	ws.on('close', function () {
		connections = connections.filter(function (conn, i) {
			return (conn === ws) ? false : true;
		});
	});
});
 
//メッセージのブロードキャスト
function broadcast(message) {
	connections.forEach(function (con, i) {
		con.send(message);
	});
};