const express = require('express');
const path = require('path');
const apicache = require('apicache');
const logger = require('log4js').getLogger('Server');
const weather = require('./server/weather');
const euronews = require('./server/euronews');
const foursquare = require('./server/foursquare');
const rightbyme = require('./server/RightByMe');

logger.level = 'debug';

const app = express();
const port = process.env.PORT || 8110;

const sitePath = 'live';

apicache.options({ 'debug': true });
const cache = apicache.middleware;

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

app.get('/weather', cache('15 minutes'), (req, res) => {
  if (req.query.hasOwnProperty('ll'))

    weather.doGetOpenWeather(req.query.ll)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
        logger.error(e);
        res.status(500).send('There was an error!');
      });

  else {
    // throw new Error('Weather: LL missing');
    logger.warn('Weather: LL missing');
    res.status(500).send('LL Missing');
  }
});

app.get('/forecast', cache('15 minutes'), (req, res) => {
  if (req.query.hasOwnProperty('ll'))

    weather.doGetFullForcast(req.query.ll)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
        logger.error(e);
        res.status(500).send('There was an error!');
      });

  else {
    // throw new Error('Weather: LL missing');
    logger.warn('Weather: LL missing');
    res.status(500).send('LL Missing');
  }
});

app.get('/weatheralert', cache('15 minutes'), (req, res) => {
  if (req.query.hasOwnProperty('ll'))
    // weather.doGetOpenWeather(req.query.ll)
    // doGetDarkSkyWeather
    weather.doGetDarkSkyWeather(req.query.ll)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
        logger.error(e);
        res.status(500).send('There was an error!');
      });

  else {
    // throw new Error('Weather: LL missing');
    logger.warn('Weather: LL missing');
    res.status(500).send('LL Missing');
  }
});

app.get('/fsexplore', cache('15 minutes'), (req, res) => {
  if (req.query.hasOwnProperty('ll'))
    foursquare.doGetFourSquareExplore(req.query.ll)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
        logger.error(e);
        res.status(500).send('There was an error!');
      });

  else {
    // throw new Error('Weather: LL missing');
    logger.warn('FS: LL missing');
    res.status(500).send('LL Missing');
  }
});

app.get('/rightbyme', cache('12 hour'), (req, res) => {
  if (req.query.hasOwnProperty('ll'))
    rightbyme.doGetRightByMe(req.query.ll)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
        logger.error(e);
        res.status(500).send('There was an error!');
      });

  else {
    // throw new Error('Weather: LL missing');
    logger.warn('FS: LL missing');
    res.status(500).send('LL Missing');
  }
});

app.get('/news', cache('15 minutes'), (req, res) => {
  euronews.getEuroNews().then((d) => {
    res.send(d);
  }).catch((e) => {
    if (e.message === '304:Not changed') {
      logger.info('Euronews ', e.message);
      res.status(304).send();
    }
    else {
      logger.error(e);
      res.status(500).send('There was an error!');
    }
  });
});

app.get('/article', cache('1 hour'), (req, res) => {
  if (req.query.hasOwnProperty('guid')) {
    logger.debug('Beofre', req.query.guid);

    euronews.getArticle(req.query.guid)
      .then((d) => {
        res.send(d);
      }).catch((e) => {
      logger.error(e);
      res.status(500).send('There was an error!');
    });
  }
  else {
    // throw new Error('Weather: LL missing');
    logger.warn('FS: GUID missing');
    res.status(500).send('GUID Missing');
  }
});

app.listen(port, (err) => {
  if (err)
    return logger.error('Server error:', err);

  logger.info(`Jubilee Server is listening on ${port}`);
});
