/**
 * Created by marti on 30/01/2016.
 */
var http = require('http'), request = require('request'), cheerio = require('cheerio'), util = require('util'),  cron = require('node-cron');
var dateFormat = require('dateformat');
var jsonfile = require('jsonfile'), fs = require('fs');
var nano = require('nano')('http://martind2000:1V3D4m526i@localhost:5984');
var log4js = require('log4js');
var logger = log4js.getLogger();
var calHandler = require('./today/calHandler');
var swedishWord = require('./today/swedishword');
var weather = require('./today/weather');
var trains = require('./today/trains');
var history = require('./today/history');
var mdMailer = require('./today/mailer');
var mdFitbit = require('./today/fitbit');
var db_name = 'silvrgit';
var dbCouch = nano.use(db_name);

require('sugar-date');

var todayCache = {
  last: 0, data: {
    trains: {last: 0, data: []}, weather: {}, history: [], today: '', tv: {entries: []}, cal: {today: [], tomorrow:[], week:[]}, swedish: {}, fitbit: {}
  }, expire: ((60 * 1000) * 60)
};
var file = __dirname + '/' + 'newdata.json';
var htmlfile = __dirname + '/' + 'today.html';
function saveData() {
  logger.info('Saving...');
  jsonfile.writeFileSync(file, todayCache);
}
function saveToDB(data) {
  logger.debug('Inserting into couch...');
  // Logger.info(util.inspect(obj));
  dbCouch.insert(data, function(err, body, header) {
    if (err) {
      logger.error('Error inserting into couch');
      logger.error(err);
      return;
    }
  });
}

function nth(d) {
  //  If (d > 3 && d < 21) {return 'th';} // Thanks kennebec
  //  if (d % 10 === 1) {return 'st';} else if (d % 10 === 2) {return 'nd';} else if (d % 10 === 3) {return 'rd';} else {return 'th';}
  var n = d;
  return Math.floor(n / 10) === 1
        ? 'th'
        : (n % 10 === 1
          ? 'st'
          : (n % 10 === 2
            ? 'nd'
            : (n % 10 === 3
              ? 'rd'
              : 'th')));
}

function dayNumber() {
  var now = new Date();
  var start = new Date(now.getFullYear(), 0, 0);
  var diff = now - start;
  var oneDay = 1000 * 60 * 60 * 24;
  return Math.floor(diff / oneDay);
}

function breakDay() {
  var now = new Date();
  return {year: now.getFullYear(), month: parseInt(now.getMonth()) + 1, day: now.getDate()}
}

/**
 * @return {number}
 */
function DayDiff(CurrentDate) {
  var TYear = CurrentDate.getFullYear();
  var TDay = new Date('January, 01, ' + (parseInt(TYear) + 1));
  TDay.getFullYear(TYear);
  var DayCount = (TDay - CurrentDate) / (1000 * 60 * 60 * 24);
  DayCount = Math.round(DayCount);

  var d = new Date();
  DayCount = d.daysSince('beginning of this year');
  return (DayCount);
}

Array.prototype.indexOfOld = Array.prototype.indexOf;
Array.prototype.indexOf = function(e, fn) {
  if (!fn) {
    return this.indexOfOld(e);
  } else {
    if (typeof fn === 'string') {
      var att = fn;
      fn = function(e) {
        return e[att];
      };
    }
    return this.map(fn).indexOfOld(e);
  }
};

module.exports = {
  getClock: function(req, res) {
    //   Console.log(todayCache);
    res.render('pages/clock', todayCache);
  }, getToday: function(req, res) {
    logger.info(todayCache);
    res.render('pages/today', todayCache);
  }, getData: function(req, res) {
    res.setHeader('Content-Type', 'application/json');
    res.end(JSON.stringify(todayCache));
  }, getTodayDate: function() {
    var s, d = new Date(), nextYear = (parseInt(d.getFullYear()) + 1).toString() + '-01-01';

    console.log(d.daysUntil('beginning of next year'));
    var daysSinceStart = d.daysSince('beginning of this year');
    var daysRemaining = d.daysUntil('beginning of next year');

    todayCache.data.history = [];
    s = '<strong>' + d.format('{Weekday} {Month} {dd}, {yyyy}') + '</strong> - ';
    /*
        S = s + 'The ' + dayNumber() + nth(dayNumber) + ' day of ' + dateFormat(d,
                'yyyy') + ', and there are ' + DayDiff(d) + ' days left until the end of the year.';
*/

    s = s + 'The ' + daysSinceStart + nth(daysSinceStart) + ' day of ' + dateFormat(d,
            'yyyy') + ', and there are ' + daysRemaining + ' days left until the end of the year.';



    logger.debug(s);
    todayCache.data.today = s;
  }, refreshTrainAndWeather: function() {
    weather.newDoGetWeather()
        .then((d) => {
          todayCache.data.weather = d;
        }).catch((e) => {
          logger.error(e);
        });
    trains.updateTrains()
        .then((d) => {
          'use strict';
          console.log('Trains: ', d);
          todayCache.data.trains.data = d;
          todayCache.data.trains.last = new Date();
        })
        .catch((e)=> {
          'use strict';
          console.error(e);
        });
  }, preLoadToday: function() {
    module.exports.getTodayDate();
    todayCache.data.cal.entries = [];
    weather.newDoGetWeather()
        .then((d)=> {
          todayCache.data.weather = d;
        })
        .catch((e) => {
          logger.error(e);
        });
    trains.updateTrains()
        .then((d) => {
          'use strict';
          console.log('Trains: ', d);
          todayCache.data.trains.data = d;
          todayCache.data.trains.last = new Date();
        })
        .catch((e)=> {
          'use strict';
          console.error(e);
        });
    history.updateHistory()
        .then((d) => {
          'use strict';
          console.log('History result: ', d);
          todayCache.data.history = d;
        })
        .catch((e)=> {
          'use strict';
          console.error(e);
        });

    calHandler.getSimpleCalV3('http://www.pogdesign.co.uk/cat/download_ics/60cfdff469d0490545d33d7e3b5c0bcc')
        .then((d) => {
          'use strict';
          todayCache.data.tv = d;
        })
        .catch((e) => {
          'use strict';
          logger.error(e);
        });


    for (var t = 0; t < calHandler.calendars.length;t++) {
      calHandler.getAdvancedCalV3(calHandler.calendars[t])
              .then((d) => {
                'use strict';
                todayCache.data.cal.today = todayCache.data.cal.today.concat(d.today);
                todayCache.data.cal.tomorrow = todayCache.data.cal.tomorrow.concat(d.tomorrow);
                todayCache.data.cal.week = todayCache.data.cal.week.concat(d.week);
              })
              .catch((e) => {
                'use strict';
                logger.error(e);
              });
    }

    /*calHandler.getSimpleCalV3(
        'https://calendar.google.com/calendar/ical/martind2000%40gmail.com/private-40cfebc9f7dcfa7fde6b9bf2f0092c93/basic.ics')
        .then((d) => {
          'use strict';
          todayCache.data.cal.entries = todayCache.data.cal.entries.concat(d.entries);
        })
        .catch((e) => {
          'use strict';
          logger.error(e);
        });
    calHandler.getSimpleCalV3(
        'https://calendar.google.com/calendar/ical/mt5pgdhknvgoc8usfnrso9vkv0%40group.calendar.google.com/private-58876002af9f302a593acfa6fa792dcf/basic.ics')
        .then((d) => {
          'use strict';
          todayCache.data.cal.entries = todayCache.data.cal.entries.concat(d.entries);
        })
        .catch((e) => {
          'use strict';
          logger.error(e);
        });
    calHandler.getSimpleCalV3(
        'https://www.tripit.com/feed/ical/private/DB96E4BB-94A9BD8F9CC1CF51C6CC0D920840F4F5/tripit.ics')
        .then((d) => {
          'use strict';
          todayCache.data.cal.entries = todayCache.data.cal.entries.concat(d.entries);
        })
        .catch((e) => {
          'use strict';
          logger.error(e);
        });
    calHandler.getSimpleCalV3(
            'https://calendar.google.com/calendar/ical/en.uk%23holiday%40group.v.calendar.google.com/public/basic.ics')
            .then((d) => {
              'use strict';
              todayCache.data.cal.entries = todayCache.data.cal.entries.concat(d.entries);
            })
            .catch((e) => {
              'use strict';
              logger.error(e);
            });
*/
    swedishWord.getSwedishWord()
        .then((d) => {
          'use strict';
          console.log('Swedish result: ', d);
          todayCache.data.swedish = d;
        })
        .catch((e)=> {
          'use strict';
          console.error(e);
        });

    mdFitbit.getYesterdayFitbit()
        .then((d) => {
          todayCache.data.fitbit = d;
        })
        .catch((e)=> {
          'use strict';
          console.error(e);
        });

    todayCache.date = breakDay();
  }
};

setTimeout(function() {
  module.exports.preLoadToday();
}, 5000);
setTimeout(function() {
  // MdMailer.sendEmailV1(todayCache, __dirname);
  // saveToDB(todayCache);
  // saveData();
}, 45000);
cron.schedule('45 6 * * *', function() {
  module.exports.preLoadToday();
  return -1;
});
cron.schedule('0 */1 * * *', function() {
  module.exports.refreshTrainAndWeather();
  return -1;
});
cron.schedule('0 7 * * *', function() {
  mdMailer.sendEmailV1(todayCache, __dirname);
  saveToDB(todayCache);
  // Console.log('tick');
  return -1;
});

