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

/*
 * Parse utilities for Vanadium logs
 * @fileoverview
 */

/*
 * Parses a single line of text produced by Vanadium logger
 * into an structured object representing it.
 * Log lines have this form:
 * Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg...
 * where the fields are defined as follows:
 *  L                A single character, representing the log level (eg 'I' for INFO)
 *  mm               The month (zero padded; ie May is '05')
 *  dd               The day (zero padded)
 *  hh:mm:ss.uuuuuu  Time in hours, minutes and fractional seconds
 *  threadid         The space-padded thread ID as returned by GetTID()
 *  file             The file name
 *  line             The line number
 *  msg              The user-supplied message
 * @param {string} vlogLine A single line of Vanadium log
 * @return {parser.item} A parsed object containing log level, date, file,
 * line number, thread id and message.
 */
export function parse(vlogLine) {

  var validLogLineRegEx = /^([IWEF])(\d{2})(\d{2})\s(\d{2}:\d{2}:\d{2}\.\d+)\s(\d+)\s(.*):(\d+)]\s+(.*)$/
  var logParts = vlogLine.match(validLogLineRegEx);
  if (!logParts || logParts.length != 8 + 1) { // 8 parts + 1 whole match
    throw new Error('Invalid vlog line format. ' + vlogLine +
      ' Lmmdd hh:mm:ss.uuuuuu threadid file:line] msg.. pattern');
  }

  var L = logParts[1];
  var month = logParts[2];
  var day = logParts[3];
  var time = logParts[4];
  var treadId = parseInt(logParts[5]);
  var file = logParts[6];
  var fileLine = parseInt(logParts[7]);
  var message = logParts[8];

  var now = new Date();
  var year = now.getFullYear();
  var thisMonth = now.getMonth() + 1; // JS months are 0-11
  // Year flip edge case, if log month > this month, we assume log line is from previous year
  if (parseInt(month) > thisMonth) {
    year--;
  }

  var date = new Date(year + '-' + month + '-' + day + ' ' + time);

  return new item(
    levelCodes[L],
    date,
    treadId,
    file,
    fileLine,
    message
  );
}

var levelCodes = {
  'I': 'info',
  'W': 'warning',
  'E': 'error',
  'F': 'fatal'
}

/*
 * A structure representing a Vanadium log item
 * @param {string} level, one of info, warning, error, fatal
 * @param {date} date, The date and time of the log item
 * @param {integer} threadId The thread ID as returned by GetTID()
 * @param {string} file The file name
 * @param {integer} fileLine The file line number
 * @param {string} message The user-supplied message
 * @class
 * @private
 */
class item {
  constructor(level, date, threadId, file, fileLine, message) {
    this.level = level;
    this.date = date;
    this.threadId = threadId;
    this.file = file;
    this.fileLine = fileLine;
    this.message = message;
  }
}
