
function Game(g, me, them) {
  //init
  var grid = g || new Grid
  var handlers = {}
  var player = me 

  this.playTurn = function _playTurn() {
    var col = player.nextMove(grid)
    var row = grid.topFreeRow(col-1) + 1
    grid = grid.drop(col-1, player)
    var won = grid.connects4(player, col-1)
    trigger('drop', player, row, col, grid)
    if (won) {
      trigger('gameOver', player)
    } else {
      switchPlayer()
    }
  }

  function switchPlayer() {
    var opponent
    if (player === me) {
      player = them
      opponent = me
    } else {
      player = me
      opponent = them
    }
    trigger('switchPlayer', player, opponent)
  }

  this.restart = function _restart() {
    grid = new Grid
    player = me
    trigger('restart')
  }

  this.handle = function _handle(evt, handler) {
    if (!handlers[evt]) handlers[evt] = [];
    handlers[evt].push(handler)
  }

  function trigger(eventName) {
    if (handlers[eventName]) {
      var args = Array.prototype.slice.call(arguments, 1)
      for (var i in handlers[eventName]) {
        handlers[eventName][i].apply(null, args)
      }
    }
  }
}
