module.exports = {
  /**
   * The reporting API version. This should be set to 3.
   */
  version: 4,

  /**
   * Report name. This should match the nesting found in the reports.js file.
   */
  name: 'ibackuptool.example',

  /**
   * Human readable description of the file
   */
  description: `Example Report module.`,

  /**
   * Optional flag requiring a backup parameter to be present in order to run this report.
   */
  requiresBackup: true,

  /**
   * Run on a v3 lib / backup object.
   * The run() function must return a promise, which always resolves to valid data.
   * If the files aren't in the backup or aren't formatted in a known way, we reject
   * and print the error message for the user.
   * @param {object} lib standard lib, contains lib.run() function.
   * @param {object} options options object.
   */
  run (lib, { backup }) {
    return new Promise((resolve, reject) => {
      // resolve to valid data.
      // Typically, this would be "raw" data containing as much info as possible.
      // Se below for data formatting.
      resolve([{
        name: 'example1',
        data: {
          code: 33,
          values: [1, 2, 3, 4, 5]
        }
      }])
    })
  },

  /**
   * The "output" property declares the public interface for most operations.
   * This provides a level of abstraction from the datatypes that are stored in the
   * backups since they may vary between versions, or need normalization.
   *
   * This collection of functions allows that to occur.
   */
  output: {
    name: el => el.name,
    code: el => el.data.code
  }

  /*
    For the above example, if run() resolved to:
    [{
      name: 'example1',
      data: {
        code: 33,
        values: [1, 2, 3, 4, 5]
      }
    }]

    The actual module output when using a normal json, csv, table formatter would be the following,
    due to the output declaration:

    [{
      name: 'example1',
      code: 33
    }]

    // We can also output a single raw object:
    {
      Name: 'test',
      Version: '1.0',
      BackupData: [104, 101, 108, 108, 111, 044, 119, 111, 114, 108, 100]
    }

    // And map it using the following output declaration:
    output: {
      name: el => el.Name,
      version: el => el.Version
    }

    To the following:
    {
      name: 'test',
      version: '1.0'
    }

    IF we specify a "raw" formatter, or run using the { raw: true } parameter to lib.run(),
    We'd get back the original raw object.

    {
      Name: 'test',
      Version: '1.0',
      BackupData: [104, 101, 108, 108, 111, 044, 119, 111, 114, 108, 100]
    }
  */
}