'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);
};

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);
      }));
    }));
  }));
};
