// vim: set ts=2 sw=2 et tw=80:

const express = require('express');
const path = require('path');
const logger = require('morgan');
const bodyParser = require('body-parser');
const kleiDust = require('klei-dust');
const methodOverride = require('method-override');
const fs = require('fs');

const app = express();

//configure app
app.use(logger('dev'));
app.set('views', __dirname + '/views');
app.engine('dust', kleiDust.dust);
app.set('view engine', 'dust');
app.set('view options', { layout: false });

app.use(methodOverride('_method'));

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false }));

// parse application/json
app.use(bodyParser.json());

app.use(express.static('public'));

fs.readFile(__dirname + '/db.json', { encoding: 'utf8' }, (e, data) => {
  if (e) {
    if (e.code === 'ENOENT') {
      console.info("No database file. Initializing with empty data");
    } else console.error(e);
    app.locals.favourites = [];
  } else {
    try {
      app.locals.favourites = JSON.parse(data);
      console.log('DB initialized', app.locals.favourites);
    } catch(e) {
      console.error(e);
      app.locals.favourites = [];
    }
  }

  // Initialize routers here
  const routers = require('./routes/routers');
  app.use('/', routers.root);
  app.use('/favorites', routers.favourites);
  app.use('/bookmarked', routers.bookmarked);
});

let writing = false;
app.locals.writeFavs = (done) => {
  if (writing) {
    setTimeout(() => app.locals.writeFavs(done), 100);
    return;
  }
  writing = true;
    fs.writeFile(__dirname + '/db.json', JSON.stringify(app.locals.favourites),
    { encoding: 'utf8' }, err => {
      if (err) console.error(err);
      writing = false;
      done();
    });
}

module.exports = app;
