// Copyright 2015 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
'use strict';

/**
 * @fileoverview Helper class for shill log processing.
 */

var logHelper = {};

/**
 * RegExp for netlog start.
 * @type {RegExp}
 */
logHelper.NET_LOG_START = /netlog=<multiline>/;

/**
 * RegExp for netlog end.
 * @type {RegExp}
 */
logHelper.NET_LOG_END = /---------- END ----------/;

/**
 * RegExp for syslog start.
 * @type {RegExp}
 */
logHelper.SYS_LOG_START = /syslog=<multiline>/;

/**
 * RegExp for system.log section end.
 * @type {RegExp}
 */
logHelper.MULTILINE_LOG_END = /---------- END ----------/;


/**
 * RegExp for log timestamp.
 * @type {RegExp}
 */
logHelper.TIME_FORMAT =
    /\d{4}-\d+-\d+T\d{2}:\d{2}:\d{2}.\d{6}(-|\+)(\d{2}):(\d{2})/;


/**
 * Method to get time offset from log line.
 *
 * @param {Object} timeMatchResults results from matching regex.
 * @return {Number} offsetMS offset ms for log time.
 * @public
 */
logHelper.getOffsetMS = function(timeMatchResults) {
  // first get minutes
  var offset = parseInt(timeMatchResults[3]);
  // next get hours
  offset += parseInt(timeMatchResults[2]) * 60;
  if (offset == 0) {
    // returns -0 when attempting to test -00:00 offset
    return 0;
  }
  // convert to ms
  offset = offset * 60 * 1000;
  // and check + or -
  if (timeMatchResults[1] == '-')
    offset *= -1;
  return offset;
};

/**
 * Method to format an elapsed time in ms to HH:MM:SS.
 *
 * @param {Number} elapsedMS elapsed ms to format.
 * @return {string} HH:MM:SS formatted version of the elapsed (ms) time
 * @public
 */
logHelper.formatElapsedMS = function(elapsedMS) {
  var ms = elapsedMS % 1000;
  if (ms < 10) {
    ms = '00' + ms;
  } else if (ms < 100) {
    ms = '0' + ms;
  }
  var elapsed = Math.floor(elapsedMS / 1000);
  var sec = Math.floor(elapsed % 3600 % 60);
  if (sec < 10) {
    sec = '0' + sec;
  }
  var min = Math.floor(elapsed % 3600 / 60);
  if (min < 10) {
    min = '0' + min;
  }
  var hour = Math.floor(elapsed / 3600);
  if (hour < 10) {
    hour = '0' + hour;
  }
  var formatted = hour + ':' + min + ':' + sec + '.' + ms;
  return formatted;
};

/**
 * Array of Objects holding regexs and handlers for system_log subsections
 * @type {Object[]}
 * @return  {int} returns new index into supplied String[]
 */
logHelper.logDetectors = {
  'netlog_multiline': {
    re: logHelper.NET_LOG_START,
    handler: function(logHolder, logLines, i) {
      // we have a netlog section of a system_log
      logHolder.fileType = 'system_log';
      logHolder.netlog = logHelper.getSubLog(logLines, i);
      console.log('found the netlog section!: ' + logHolder.netlog.length);
      return i + logHolder.netlog.length;
    }
  },
  'syslog_multiline': {
    re: logHelper.SYS_LOG_START,
    handler: function(logHolder, logLines, i) {
      // we have a syslog section of a system_log
      logHolder.fileType = 'system_log';
      logHolder.syslog = logHelper.getSubLog(logLines, i);
      console.log('found the syslog section!: ' + logHolder.syslog.length);
      return i + logHolder.syslog.length;
    }
  }
};

/**
 * Helper method checking what type of log is being processed.
 *
 * @param {String[]} logLines String array for lines in a log.
 * @return {Object} returns String of the file type
 */
logHelper.detectFileType = function(logLines) {
  var logHolder = {fileType: 'unknown'};
  var match;
  // first check if the supplied log has subsections
  for (var i = 0; i < logLines.length; i++) {
    for (var detector in logHelper.logDetectors) {
      match = logLines[i].match(logHelper.logDetectors[detector].re);
      if (match != null) {
        i = logHelper
            .logDetectors[detector]
            .handler(logHolder, logLines, i + 2) + 1;
        break;
      }

    }
  }

  if (logHolder.fileType == 'unknown') {
    if (netlogSummary.netlogTypeCheck(logLines)) {
      // supplied file is netlog
      logHolder.fileType = 'netlog';
      logHolder.netlog = logLines;
    } else if (syslogSummary.syslogTypeCheck(logLines)) {
      // supplied file is syslog
      logHolder.fileType = 'syslog';
      logHolder.syslog = logLines;
    } else {
      console.log('file type unknown');
    }
  }

  return logHolder;
};

/**
 * Helper method to extract a sublog of a file.
 *
 * @param {String[]} logLines String array for lines in a log.
 * @param {int} i Start index for the sublog
 * @return {String[]} returns String[] of the sublog lines
 */
logHelper.getSubLog = function(logLines, i) {
  var subLog = [];
  while (i < logLines.length) {
    if (logHelper.MULTILINE_LOG_END.test(logLines[i])) {
      // subsection is done...
      return subLog;
    }
    var time = logLines[i].match(logHelper.TIME_FORMAT);
    if (time == null) {
      console.log('processing sublog, log line time was null');
    } else {
      subLog.push(logLines[i]);
    }
    i++;
  }
  return subLog;
}
