const app = require("./app");
const common = require("./common");
const debug = require("debug")("node-angular");
const http = require("http");
var connect = require('./connect').setServerConfiguration(); //Do NOT Remove
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const packageDefinition = protoLoader.loadSync('./controllers/loopd/client.proto', {keepCase: true, longs: String, enums: String, defaults: true, oneofs: true});
const looprpc = grpc.loadPackageDefinition(packageDefinition).looprpc;
const swapClient = new looprpc.SwapClient('localhost:11010', grpc.credentials.createInsecure());

const onError = error => {
  if (error.syscall !== "listen") {
    throw error;
  }
  const bind = typeof addr === "string" ? "pipe " + addr : "port " + common.port;
  switch (error.code) {
    case "EACCES":
      console.error(bind + " requires elevated privileges");
      process.exit(1);
      break;
    case "EADDRINUSE":
      console.error(bind + " is already in use");
      process.exit(1);
      break;
    case "ECONNREFUSED":
      console.error("Server is down/locked");
    default:
      console.error("DEFUALT ERROR");
      console.error(error.code);
      throw error;
  }
};

const onListening = () => {
  const addr = server.address();
  const bind = typeof addr === "string" ? "pipe " + addr : "port " + common.port;
  debug("Listening on " + bind);
  console.log('Server is up and running, please open the UI at http://localhost:' + common.port); 
};

const server = http.createServer(app);
const io = require('socket.io')(server);

const loopMonitor = io.of('/loopMonitor').on('connection', (socket) => {
  let i = 1;
  let call = null;
  socket.on('start', function() {
    console.log('Application started subscription');
    console.log(call);
    var request = {};
    call = swapClient.monitor(request);
    call.on('data', function(response) {
      console.log('Monitor sent message as: ' + JSON.stringify(response));
      socket.emit('message', { message: response });
    });
    call.on('status', function(status) {
      console.log('Monitor status: ' + JSON.stringify(status));
      socket.emit('status', { message: status });
    });
    call.on('end', function() {
      console.log('Monitor stopped streaming');
      socket.emit('end');
    });
    interval = setInterval(() => {
      socket.emit('message', { message: 'Message ' + i });
      i++;
    }, 15000);
  });
  socket.on('end', function() {
    call = null;
    clearInterval(interval);
    console.log('Socket stopped subscription');
  });
});
  
server.on("error", onError);
server.on("listening", onListening);
server.listen(common.port);
