/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

// This singleton can be used for logging data for offline processing. Data
// logged with it can conveniently be parsed and processed with e.g. Matlab.
//
// Following is an example of the log file format, starting with the header
// row at line 1, and the data rows following.
// col1,col2,col3,multi-value-col4[3],,,col5
// 123,10.2,-243,1,2,3,100
// 241,12.3,233,1,2,3,200
// 13,16.4,-13,1,2,3,300
//
// As can be seen in the example, a multi-value-column is specified with the
// name followed the number of elements it contains. This followed by
// number of elements - 1 empty columns.
//
// Without multi-value-columns this format can be natively by Matlab. With
// multi-value-columns a small Matlab script is needed, available at
// trunk/tools/matlab/parseLog.m.
//
// Table names and column names are case sensitive.

#ifndef WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_
#define WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_

#include <string>

#include "webrtc/system_wrappers/include/data_log_impl.h"

namespace webrtc {

class DataLog {
 public:
  // Creates a log which uses a separate thread (referred to as the file
  // writer thread) for writing log rows to file.
  //
  // Calls to this function after the log object has been created will only
  // increment the reference counter.
  static int CreateLog();

  // Decrements the reference counter and deletes the log when the counter
  // reaches 0. Should be called equal number of times as successful calls to
  // CreateLog or memory leak will occur.
  static void ReturnLog();

  // Combines the string table_name and the integer table_id into a new string
  // table_name + _ + table_id. The new string will be lower-case.
  static std::string Combine(const std::string& table_name, int table_id);

  // Adds a new table, with the name table_name, and creates the file, with the
  // name table_name + ".txt", to which the table will be written.
  // table_name is treated in a case sensitive way.
  static int AddTable(const std::string& table_name);

  // Adds a new column to a table. The column will be a multi-value-column
  // if multi_value_length is greater than 1.
  // table_name and column_name are treated in a case sensitive way.
  static int AddColumn(const std::string& table_name,
                       const std::string& column_name,
                       int multi_value_length);

  // Inserts a single value into a table with name table_name at the column with
  // name column_name.
  // Note that the ValueContainer makes use of the copy constructor,
  // operator= and operator<< of the type T, and that the template type must
  // implement a deep copy copy constructor and operator=.
  // Copy constructor and operator= must not be disabled for the type T.
  // table_name and column_name are treated in a case sensitive way.
  template<class T>
  static int InsertCell(const std::string& table_name,
                        const std::string& column_name,
                        T value) {
    DataLogImpl* data_log = DataLogImpl::StaticInstance();
    if (data_log == NULL)
      return -1;
    return data_log->InsertCell(
             table_name,
             column_name,
             new ValueContainer<T>(value));
  }

  // Inserts an array of values into a table with name table_name at the
  // column specified by column_name, which must be a multi-value-column.
  // Note that the MultiValueContainer makes use of the copy constructor,
  // operator= and operator<< of the type T, and that the template type
  // must implement a deep copy copy constructor and operator=.
  // Copy constructor and operator= must not be disabled for the type T.
  // table_name and column_name are treated in a case sensitive way.
  template<class T>
  static int InsertCell(const std::string& table_name,
                        const std::string& column_name,
                        const T* array,
                        int length) {
    DataLogImpl* data_log = DataLogImpl::StaticInstance();
    if (data_log == NULL)
      return -1;
    return data_log->InsertCell(
             table_name,
             column_name,
             new MultiValueContainer<T>(array, length));
  }

  // For the table with name table_name: Writes the current row to file.
  // Starts a new empty row.
  // table_name is treated in a case-sensitive way.
  static int NextRow(const std::string& table_name);
};

}  // namespace webrtc

#endif  // WEBRTC_SYSTEM_WRAPPERS_INTERFACE_DATA_LOG_H_
