/**
 * Copyright (c) 2015-present, Facebook, Inc.
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree. An additional grant
 * of patent rights can be found in the PATENTS file in the same directory.
 */
'use strict';


function attachToServer(server, path) {
  var WebSocketServer = require('ws').Server;
  var wss = new WebSocketServer({
    server: server,
    path: path
  });
  var clients = [];

  function sendSpecial(message) {
    clients.forEach(function (cn) {
      try {
        cn.send(JSON.stringify(message));
      } catch(e) {
        // Sometimes this call throws 'not opened'
      }
    });
  }

  wss.on('connection', function(ws) {
    var id = Math.random().toString(15).slice(10, 20);
    sendSpecial({$open: id});
    clients.push(ws);

    var allClientsExcept = function(ws) {
      return clients.filter(function(cn) { return cn !== ws; });
    };

    ws.onerror = function() {
      clients = allClientsExcept(ws);
      sendSpecial({$error: id});
    };

    ws.onclose = function() {
      clients = allClientsExcept(ws);
      sendSpecial({$close: id});
    };

    ws.on('message', function(message) {
      allClientsExcept(ws).forEach(function(cn) {
        try {
          cn.send(message);
        } catch(e) {
          // Sometimes this call throws 'not opened'
        }
      });
    });
  });

  return {
    server: wss,
    isChromeConnected: function() {
      return clients
        .map(function(ws) { return ws.upgradeReq.headers['user-agent']; })
        .filter(Boolean)
        .some(function(userAgent) { return userAgent.includes('Chrome'); });
    }
  };
}

module.exports = {
  attachToServer: attachToServer
};