var fs = require('fs');
var http = require('https');
var sockjs = require('sockjs');
var connect = require('connect');
var irc = require('irc');
var Clients = [];

Clients.broadcast = function(object) { //broadcast to all clients
  Clients.forEach(function(client) {
    client.write(JSON.stringify(object));
  });
}

var serverCommands = {};

serverCommands.say = function (settings, params) {
  var nick = settings.nick || settings.conn.remoteAddress
  var message = params.message
  irc_client.say("#krebs", nick + ' → ' + message);
  return Clients.broadcast({ type: 'message', nick: nick, message: message })
}

serverCommands.nick = function (settings, params) {
  var oldnick = settings.nick || settings.conn.remoteAddress
  var newnick = params.nick
  settings.nick = newnick
  return Clients.broadcast({ type: 'nickchange', nick: oldnick, newnick: newnick })
}

serverCommands.badcommand = function (settings, params) {
  settings.conn.write(JSON.stringify({ type: 'usererror', message: 'bad command' }))
}

var irc_reconnect = function() { //reconnt to irc
  console.log("reconnecting due to pingtimeout");
  irc_client.disconnect();
  irc_client.connect();
}

var pingTimeoutDelay = 3*60*1000
var lastping = setTimeout(irc_reconnect, pingTimeoutDelay)

var irc_client = new irc.Client('irc.freenode.net', 'kweb', { //create irc_client to talk to irc
  channels: ['#krebs'], //todo: read from local_config
  sasl: true, 
  secure: true,
  userName: 'kweb', //todo: read from local_config
  realName: 'kweb', //todo: read from local_config
  password: fs.readFileSync(__dirname+'/local_config/irc.key').toString(),
  debug: false,
  showErrors: true,
  floodProtection: true,
  port: 6697,
  autoRejoin: true,
  autoConnect: true,
  stripColors: true
});


irc_client.on('ping', function(server) { //restart timer on server ping
  console.log("got ping from server, renewing timeout for automatic reconnect");
  clearTimeout(lastping);
  lastping = setTimeout(irc_reconnect, pingTimeoutDelay); //reconnect after irc timeout
})

irc_client.on('message#krebs', function(from, message) {
  console.log({ from: from, message: message });
  Clients.broadcast({ type: 'message', from: from, message: message }); //broadcast irc messages to all connected clients
  clearTimeout(lastping);
});

irc_client.on('names#krebs', function(nicks) {
  Clients.broadcast({type: 'nicklist', message: nicks});
});

irc_client.on('join#krebs', function(nick, msg) {
  if (nick !== 'kweb'){
    Clients.broadcast({type: 'join', from: nick});
  }
});

irc_client.on('part#krebs', function(nick, rs, msg) {
  Clients.broadcast({type: 'quit', from: nick});
});

var web_serv_options = { //certificates for https
  key: fs.readFileSync(__dirname+'/local_config/server_npw.key'),
  cert: fs.readFileSync(__dirname+'/local_config/server.crt'),
};

var echo = sockjs.createServer();
echo.on('connection', function(conn) {
  var origin = conn.remoteAddress;
  var settings = {
    conn: conn
  }
  Clients.push(conn);
  Clients.broadcast({type: 'join', from: origin})
//  irc_client.say("#krebs", origin + ' has joined');
  if (typeof irc_client.chans['#krebs'] === 'object') {
    conn.write(JSON.stringify({type: 'nicklist', message: irc_client.chans['#krebs'].users})); //send current nicklist
  };
  conn.write(JSON.stringify({type: 'message', from: 'system', message: 'hello' })) //welcome message
  console.log(irc_client.chans['#krebs'])
  conn.on('data', function(data) {
    console.log('data:',data);
    try {
      var command = JSON.parse(data);
      return (serverCommands[command.method] || serverCommands.badcommand)(settings, command.params)

    } catch (error) {
      console.log(error);
    }
  });
  conn.on('close', function() { //propagate if client quits the page
  Clients.splice(Clients.indexOf(conn));
  Clients.broadcast({type: 'quit', from: origin})
//  irc_client.say("#krebs", origin + ' has quit');
});
});


var app = connect()
  .use(connect.logger('dev'))
  .use(connect.static(__dirname+'/public'))
  .use( function (req, res) {
    res.writeHead(200, {'Content-Type': 'text/html'});
    page_template='<!doctype html>\n';
    page_template+='<link rel="stylesheet" type="text/css" href="reset.css">\n';
    page_template+='<script src="sockjs-0.3.min.js"></script>\n';
    page_template+='<script src="jquery-2.0.3.min.js"></script>\n';
    page_template+='<script src="commands.js"></script>\n';
    page_template+='<script src="functions.js"></script>\n';
    page_template+='<script src="client.js"></script>\n';
    page_template+='<div id="bg">';
    page_template+='<div id="chatter">';
    page_template+='<div id="space"></div>';
    page_template+='hello, this is the official krebs support:<br>\n';
    page_template+='<table id="chatbox"><tr id="foot"><td id="time"></td><td id="nick" class="chat_from"></td><td><input type="text" id="input"></td></tr></table>\n';
    page_template+='</div>';
    page_template+='<div id="sideboard"><div id=nicklist></div>';
    page_template+='<div id="links">';
    page_template+='<a href="http://gold.krebsco.de/">krebsgold browser plugin</a><br>';
    page_template+='<a href="http://ire:1027/dashboard/">ire: Retiolum Dashboard</a><br>';
    page_template+='<a href="http://pigstarter/">pigstarter: network graphs</a><br>';
    page_template+='</div></div></div>';
    res.end(page_template);

  })
var server = http.createServer(web_serv_options, app);
echo.installHandlers(server, {prefix:'/echo'});
server.listen(1337, '0.0.0.0');
console.log('Server running at https://127.0.0.1:1337/');