
/*
 * Copyright 2017-present Open Networking Foundation

 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at

 * http://www.apache.org/licenses/LICENSE-2.0

 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


(function () {
  'use strict';

  const express = require('express');
  const app = express();
  const config = require('./config/config.js').gateway;
  const bodyParser = require('body-parser');
  const cors = require('cors');
  const socketIo = require('./controllers/websocket.js');
  const logger = require('./config/logger.js');

  // Apply middlewares
  app.use(cors());
  app.use(bodyParser.json());

  app.get('/', function(req, res) {
    res.send('Welcome to the websocket server for XOS');
  });

  const startServer = (port) => {

    // if is running just return it
    if(app.server) {
      return app.server;
    }

    const server =  app.listen(port || config.port, function() {
      logger.info(`Express is listening to http://localhost:${port || config.port}`);

      // once server is ready setup WebSocket
      socketIo.create(server);

      // start kafka
      require('./controllers/kafka.js');
    });
    app.server = server;
    return server;
  };

  const stopServer = () => {
    if(app.server) {
      app.server.close();
    }
  }

  if(!module.parent) {
    startServer();
  }

  module.exports = {
    app: app,
    start: startServer,
    stop: stopServer
  };
})();
