let express = require('express'),
path = require('path'),
favicon = require('serve-favicon'),
logger = require('morgan'),
cookieParser = require('cookie-parser'),
bodyParser = require('body-parser'),
socketio = require('socket.io'),
session = require('express-session'),
low = require('lowdb');

let config = low('config.json');
let db = low('db.json');

let tbdLabel = config.get('mainConfig').chain().find({ param: 'tbdLabel' }).value()['value'];
//let tbdLabel = config.get('mainConfig').chain().find({ param: 'tbdLabel' }).value()['value'];

let routes = require('./routes/routes'),
app = express();

let io           = socketio();
app.io           = io;

let state = db.getState();

let resetState = {
    teams : [
      ["Team 1", "Team 2"], /* first matchup */
      ["Team 3", null],  /* second matchup */
    ],
    results : [
      [[1,2]],       /* first round */
      [[4,null]]        /* second round */
    ]
  }

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(session({
    secret: 'thisIsTheSessionSecret',
    name: 'uniScoreCookie',
    resave: true,
    saveUninitialized: true
  }));

app.use(express.static(path.join(__dirname, 'public')));

app.use('/', routes);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handlers

// development error handler
// will print stacktrace
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.render('error', {
      message: err.message,
      error: err
    });
  });
}

// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) {
  res.status(err.status || 500);
  res.render('error', {
    message: err.message,
    error: {}
  });
});

// Socket IO actions



io.on('connection', function (socket) {

  socket.on('loadState', function (context) {
    socket.emit('stateChange', state);
    console.log("sent state");
  });

  socket.on('clientrefresh', function () {
    console.log("Refreshing all Clients");
    io.emit('clientrefresh');
  });

  socket.on('editState', function (newState) {
    state = newState;
    db.setState(state);
    io.emit('stateChange', state); // Push state to all clients
    console.log("updated state");
  });

});



module.exports = app;
