const Collection = require('mongodb').MongoClient;
const mongoose = require('mongoose');

const mongodb_hostname = process.env.MONGODB_HOST || 'localhost';
const mongodb_port = process.env.MONGODB_PORT || 27017;
const mongodb_database = process.env.MONGODB_DATABASE || 'lsp';
const mongodb_url = 'mongodb://' + mongodb_hostname + ':' + mongodb_port;

const db = mongoose.connection;


const bucketMaxSize = 1000;

var _db;
var _data = Collection();
var _ipx_data;
var _events;
var _alerts;

var days = function(date) {
  const complete = new Date(1000 * date);
  const days = new Date(complete.toDateString())
  return days;
}

var init = function (callback) {
  mongoose.connect(mongodb_url, { useNewUrlParser: true, useUnifiedTopology: true });
  db.on('error', console.error.bind(console, 'connection error:'));
  db.once('open', function () {
    // we're connected!
    if (callback) callback(null);
  });
  // client.connect(function (err) {
  //   if (err) {
  //     if (callback) callback({ error: "Error connecting to DB: " + err })
  //   }
  //   else {
  //     _db       = client.db(mongodb_database);
  //     _data     = _db.collection('data');
  //     _ipx_data = _db.collection('ipx-data');
  //     _events   = _db.collection('events');
  //     _alerts   = _db.collection('alerts');

  //     ////////////////////////////
  //     // FLUSH DB BY UNCOMMENTING 
  //     // _data.remove(function(err, objects){});
  //     // _ipx_data.remove(function(err, objects){});
  //     // _events.remove(function(err, objects){});
  //     // _alerts.remove(function(err, objects){});

  //     if (callback) callback(null);
  //   }
  // });
}

var addData = function (relay, device, element, callback) {
  // const query = {
  //   device: device,
  //   date: days(element.date),
  //   bucketSize: { $lt: bucketMaxSize },
  // };

  // const data = {
  //   index: element.index,
  //   value: element.value,
  //   date: new Date(1000 * element.date)
  // };

  // const update = {
  //   $push: {
  //     data: data
  //   },
  //   $min: { min: data.value },
  //   $max: { max: data.value },
  //   $inc: { bucketSize: 1 },
  // };

  // const options = {
  //   upsert: true
  // };

  // _data.updateOne(query, update, options, function (err, result) {
  //   if (callback) { callback(err, result); }
  // });
}

var addEvent = function (relay, device, element, callback) {
  // const query = {
  //   device: device,
  //   day: days(element.date),
  //   bucketSize: { $lt: bucketMaxSize },
  // };

  // const event = {
  //   index: element.index,
  //   value: element.value,
  //   type: element.type,
  //   date: new Date(1000 * element.date)
  // };

  // const update = {
  //   $push: {
  //     events: event
  //   },
  //   $min: { first: event.date },
  //   $max: { last: event.date },
  //   $inc: { bucketSize: 1 },
  // };

  // const options = {
  //   upsert: true
  // };

  // _events.updateOne(query, update, options, function (err, result) {
  //   if (callback) { callback(err, result); }
  // });
}

var addAlert = function (relay, device, element, callback) {
  // const object = {
  //   relay: relay,
  //   device: device,
  //   date: new Date(1000 * element.date),
  //   alert: element.alerts
  // };

  // _alerts.insertOne(object, function (err, result) {
  //   if (callback) { callback(err, result); }
  // });
}

var addIPXData = function (relay, device, child, element, callback) {
  // const query = {
  //   child: child,
  //   date: days(element.timestamp),
  //   bucketSize: { $lt: bucketMaxSize },
  // };

  // const data = {
  //   date: new Date(1000 * element.timestamp),
  //   tags: element.tags
  // };

  // const update = {
  //   $push: {
  //     data: data
  //   },
  //   $min: { first: data.date },
  //   $max: { last: data.date },
  //   $inc: { bucketSize: 1 },
  // };

  // const options = {
  //   upsert: true
  // };

  // _ipx_data.updateOne(query, update, options, function (err, result) {
  //   if (callback) { callback(err, result); }
  // });
}

exports.init = init

exports.addData = addData
exports.addEvent = addEvent
exports.addAlert = addAlert
exports.addIPXData = addIPXData