/**
 * node-archiver
 *
 * Copyright (c) 2012-2014 Chris Talkington, contributors.
 * Licensed under the MIT license.
 * https://github.com/ctalkington/node-archiver/blob/master/LICENSE-MIT
 */
var ArchiverCore = require('./modules/core');
var formatModules = {};

var archiver = module.exports = function(format, options) {
  return archiver.create(format, options);
};

archiver.create = function(format, options) {
  if (formatModules[format]) {
    var inst = new ArchiverCore(options);
    inst.setModule(new formatModules[format](options));

    return inst;
  } else {
    throw new Error('unknown format: ' + format);
  }
};

archiver.registerFormat = function(format, module) {
  if (module && typeof module === 'function' && typeof module.prototype.append === 'function') {
    formatModules[format] = module;

    // backwards compat
    var compatName = 'create' + format.charAt(0).toUpperCase() + format.slice(1);
    archiver[compatName] = function(options) {
      return archiver.create(format, options);
    };
  } else {
    throw new Error('format module invalid: ' + format);
  }
};

archiver.registerFormat('zip', require('./modules/zip'));
archiver.registerFormat('tar', require('./modules/tar'));
archiver.registerFormat('json', require('./modules/json'));