'use strict';
var logger = require('log4js').getLogger();

var Sugar = require('sugar/date');



module.exports = function(db) {
  var module = {};


  module.sqlGetAllRaw = function(type, deviceId) {
    return new Promise(function(resolve, reject) {
          db.any('select distinct on (raw.timestamp) * from raw where type=$1 and device=$2 order by timestamp asc;', [type,deviceId])
            .then(function(d) {
              return resolve(d);
            })
            .catch((err)=> {
              logger.error(err);
              return reject(err);
            });
        });
  };

  module.sqlGetRangedRaw = function(params) {
      return new Promise(function(resolve, reject) {
        db.any('select distinct on (raw.timestamp) * from raw where type=$1 and device=$2 and timestamp between $3 and $4 order by timestamp asc;', [params.type, params.device, params.startTS, params.endTS])
          .then(function(d) {
            return resolve(d);
          })
          .catch((err)=> {
            logger.error(err);
            return reject(err);
          });

      });

    };



  module.doGet = function(params) {
    var self = this;
    var _obj = {};
    var useRange=false;
    return new Promise(function(resolve, reject) {
      logger.debug('historian.doGet', params);


      _obj.type = params.type;
      _obj.device = params.device;

      if (params.hasOwnProperty('start') && params.hasOwnProperty('end')) {

        try{
          _obj.startTS = new Sugar.Date(parseInt(params.start,10)).raw;
          _obj.endTS = new Sugar.Date(parseInt(params.end,10)).raw;
          useRange = true;
        }
        catch(err)
        {
          logger.error(err);
          useRange = false;
        }

        if ((_obj.start === null) || (_obj.end === null))
        {
          useRange = false;
        }

      }

      if (useRange) {

        logger.info('Userange:',_obj);

        self.sqlGetRangedRaw(_obj)
          .then(function(d) {
            resolve(d);
          })
          .catch(function(e) {
            logger.error(e);
            reject(e);
          });

      } else {

        self.sqlGetAllRaw(_obj.type, _obj.device)
          .then(function(d) {
            resolve(d);
          })
          .catch(function(e) {
                              logger.error(e);
                              reject(e);
                            });

      }


    });
  };


  return module;
};