'use strict';

// node env only

global.Random = require("random-js");
require("./util.js");
require("./Callback.js");
require("./Game.js");
require("./Phase.js");
require("./IO.js");
require("./Player.js");
require("./Card.js");
require("./Zone.js");
require("./CardInfo.js");
require("./Timming.js");
require("./Mask.js");
require("./ConstEffect.js");
require("./ConstEffectManager.js");
require("./Effect.js");
require("./EffectManager.js");
require("./Client.js");
require("./Room.js");
require("./RoomManager.js");

var noStaticServe = process.argv.slice(2).some(function(arg) {
  return arg === 'no-static-server';
});
// static server
if (!noStaticServe) {
  var express = require('express');
  var compression = require('compression');
  var app = express();
  var server = require('http').Server(app);
  app.use(compression());
  app.use('/background', express.static(__dirname + '/webxoss-client/images', {
    maxAge: '2h'
  }));
  app.use('/images', express.static(__dirname + '/webxoss-client/images', {
    maxAge: '30d'
  }));
  app.use(express.static(__dirname + '/webxoss-client'));
  var port = 80;
  process.argv.slice(2).forEach(function(arg) {
    var match = arg.match(/^port=(\d+)/)
    if (match) {
      port = +match[1];
    }
  });
  server.listen(port);
  console.log('listen to 127.0.0.1:' + port);
}
// game server
var getArg = function(key) {
  var value = '';
  process.argv.slice(2).forEach(function(arg) {
    if (arg.indexOf(key + '=') === 0) {
      value = arg.replace(key + '=', '');
    }
  });
  return value;
};
var gameServer
if (getArg('key')) {
  var fs = require('fs');
  gameServer = require('https').createServer({
    key: fs.readFileSync(getArg('key')),
    cert: fs.readFileSync(getArg('cert')),
    ca: fs.readFileSync(getArg('ca')),
  });
} else {
  gameServer = require('http').createServer();
}
var io = require('socket.io')(gameServer, {
  pingTimeout: 30000,
  maxHttpBufferSize: 1024 * 1024,
});
gameServer.listen(2015);

var cfg = {
  MAX_ROOMS: 100,
  MAX_CLIENTS: 500,
  MAX_ROOM_NAME_LENGTH: 15,
  MAX_NICKNAME_LENGTH: 10,
  MAX_PASSWORD_LENGTH: 15
};
var roomManager = new RoomManager(cfg);
var MAX_SOCKETS = 500;
// var MAX_SOCKETS_PER_IP = 50;
// var ipTable = {};
function getSocketCount() {
  if (!io.sockets) return 0;
  return Object.keys(io.sockets.connected).length;
}
io.use(function(socket, next) {
  if (getSocketCount() >= MAX_SOCKETS) {
    next(new Error('MAX_SOCKETS'));
    return;
  }
  // var handshake = socket.request;
  // var ip = handshake.connection.remoteAddress;
  // if (!ip) {
  // 	next();
  // 	return;
  // }
  // if (ip in ipTable) {
  // 	if (ipTable[ip] >= MAX_SOCKETS_PER_IP) {
  // 		console.log('MAX_SOCKETS_PER_IP: %s',ip);
  // 		next(new Error('MAX_SOCKETS_PER_IP'));
  // 		return;
  // 	} else {
  // 		ipTable[ip]++;
  // 	}
  // } else {
  // 	ipTable[ip] = 1;
  // }
  // socket.on('disconnect',function () {
  // 	console.log('disconnect: %s, count: %s',ip,getSocketCount());
  // 	if (ip in ipTable) {
  // 		if (ipTable[ip] <= 1) {
  // 			delete ipTable[ip];
  // 		} else {
  // 			ipTable[ip]--;
  // 		}
  // 	}
  // });
  next();
});
io.on('connect', function(socket) {
  var req = socket.request;
  if (req.connection.destroyed) {
    console.log('req.connection.destroyed');
    return;
  }
  var query = require('url').parse(req.url, true).query;
  // console.log('connect: %s, count: %s',req.connection.remoteAddress,getSocketCount());
  // console.log(query.clientId);
  roomManager.createClient(socket, +query.clientId);

  // test
  // socket.on('force disconnect',function () {
  // 	socket.disconnect();
  // });

  // for debug
  if (typeof process === 'undefined') return;
  var password = '';
  process.argv.slice(2).forEach(function(arg) {
    var match = arg.match(/^debug_password=(\S+)/)
    if (match) {
      password = match[1];
    }
  });
  if (!password) return;
  socket.on('debug', function(psw) {
    if (psw !== password) return;
    try {
      var path = require('path');
      var filePath = './debug.js';
      delete require.cache[path.resolve(filePath)];
      require(filePath);
    } catch (e) {
      console.log(e);
    }
  });
});

exports.roomManager = roomManager;