'use strict';

var _ = require('lodash');
var moment = require('moment');
var randomBytes = require('randombytes');
var React = require('react');
var vtrace = require('vanadium').vtrace;

exports.h = function(selector, props, children) {
  if (_.isPlainObject(props)) {
    console.assert(!props.id && !props.className);
  } else {
    children = props;
    props = {};
  }
  var parts = selector.split('.');
  var x = parts[0].split('#'), tagName = x[0], id = x[1];
  var className = parts.slice(1).join(' ');
  console.assert(tagName);
  props = _.assign({}, props, {
    id: id || undefined,
    className: className || undefined
  });
  return React.createElement(tagName, props, children);
};

// Returns a string timestamp, useful for logging.
exports.timestamp = function(t) {
  t = t || Date.now();
  return moment(t).format('HH:mm:ss.SSS');
};

// Returns a unique string identifier of the given length.
exports.uid = function(len) {
  len = len || 16;
  return randomBytes(Math.ceil(len / 2)).toString('hex').substr(0, len);
};

// Converts from binary to hex-encoded string and vice versa.
exports.strToHex = function(s) {
  return new Buffer(s, 'binary').toString('hex');
};
exports.hexToStr = function(s) {
  return new Buffer(s, 'hex').toString('binary');
};

function logStart(name) {
  console.log(name + ' start');
  return Date.now();
}

function logStop(name, start, err) {
  var dt = Date.now() - start;
  console.log(name + (err ? ' FAILED after ' : ' took ') + dt + 'ms');
  if (err) console.error(err);
}

// Wraps the given callback to log start time, stop time, and delta time of a
// function invocation.
function logFn(name, cb) {
  var start = logStart(name);
  return function(err) {
    logStop(name, start, err);
    cb.apply(null, arguments);
  };
}
exports.logFn = logFn;

// Returns a new Vanadium context object with the given name.
exports.wn = function(ctx, name) {
  return vtrace.withNewSpan(ctx, name);
};

// Returns a new Vanadium context object with a timeout.
function wt(ctx, timeout) {
  return ctx.withTimeout(timeout || 5000);
}
exports.wt = wt;

// Creates <app>/<database>/<table> hierarchy in Syncbase.
// Note, for errors we still return the db handle since some errors (e.g.
// verror.ExistError) are non-fatal.
exports.createHierarchy = function(ctx, service, appName, dbName, tbName, cb) {
  var app = service.app(appName), db = app.noSqlDatabase(dbName);
  var appLog = 'create app "' + appName + '"';
  app.create(wt(ctx), {}, logFn(appLog, function(err) {
    if (err) return cb(err, db);
    var dbLog = 'create database "' + dbName + '"';
    db.create(wt(ctx), {}, logFn(dbLog, function(err) {
      if (err) return cb(err, db);
      var tbLog = 'create table "' + tbName + '"';
      db.createTable(wt(ctx), tbName, {}, logFn(tbLog, function(err) {
        if (err) return cb(err, db);
        cb(null, db);
      }));
    }));
  }));
};
