'use strict';
if (!process.env.LEVEL_ADAPTER &&
    !process.env.LEVEL_PREFIX &&
    !process.env.AUTO_COMPACTION &&
    !process.env.ADAPTER) {
  // these tests don't make sense for anything other than default leveldown
  var path = require('path');
  var mkdirp = require('mkdirp');
  var rimraf = require('rimraf');

  describe('defaults', function () {

    beforeEach(function () {
      return new PouchDB('mydb').destroy().then(function () {
        return new PouchDB('mydb', {db: require('memdown')}).destroy();
      });
    });

    afterEach(function (done) {
      rimraf.sync('./tmp/_pouch_.');
      rimraf.sync('./tmp/path');
      done();
    });

    it('should allow prefixes', function () {
      var prefix = './tmp/path/to/db/1/';
      var dir = path.join(prefix, '/tmp/');
      var dir2 = path.join('./tmp/_pouch_./', prefix);
      var dir3 = path.join(dir2, './tmp/_pouch_mydb');
      mkdirp.sync(dir);
      mkdirp.sync(dir2);
      mkdirp.sync(dir3);

      var db = new PouchDB('mydb', {prefix: prefix});
      return db.info().then(function (info1) {
        info1.db_name.should.equal('mydb');
        return db.destroy();
      });
    });

    it('Defaults leaks eventEmitters', function () {
      PouchDB.defaults({db: require('memdown') });
      PouchDB.defaults({db: require('memdown') });
      PouchDB.defaults({db: require('memdown') });
      PouchDB.defaults({db: require('memdown') });
    });

    it('should allow us to set a prefix by default', function () {
      var prefix = './tmp/path/to/db/2/';
      var dir = path.join(prefix, '/tmp/');
      var dir2 = path.join('./tmp/_pouch_./', prefix);
      var dir3 = path.join(dir2, './tmp/_pouch_mydb');
      mkdirp.sync(dir);
      mkdirp.sync(dir2);
      mkdirp.sync(dir3);

      var CustomPouch = PouchDB.defaults({
        prefix: prefix
      });
      /* jshint newcap:false */
      var db = CustomPouch({name: 'mydb'});
      return db.info().then(function (info1) {
        info1.db_name.should.equal('mydb');
        return db.destroy();
      });
    });

    it('should allow us to use memdown', function () {
      var opts = { name: 'mydb', db: require('memdown') };
      var db = new PouchDB(opts);
      return db.put({_id: 'foo'}).then(function () {
        var otherDB = new PouchDB('mydb');
        return db.info().then(function (info1) {
          return otherDB.info().then(function (info2) {
            info1.doc_count.should.not.equal(info2.doc_count);
            return otherDB.destroy();
          }).then(function () {
            return db.destroy();
          });
        });
      });
    });

    it('should allow us to destroy memdown', function () {
      var opts = {db: require('memdown') };
      var db = new PouchDB('mydb', opts);
      return db.put({_id: 'foo'}).then(function () {
        var otherDB = new PouchDB('mydb', opts);
        return db.info().then(function (info1) {
          return otherDB.info().then(function (info2) {
            info1.doc_count.should.equal(info2.doc_count);
            return otherDB.destroy();
          }).then(function () {
            var db3 = new PouchDB('mydb', opts);
            return db3.info().then(function (info) {
              info.doc_count.should.equal(0);
              return db3.destroy();
            });
          });
        });
      });
    });

    it('should allow us to use memdown by default', function () {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});
      var db = new CustomPouch('mydb');
      return db.put({_id: 'foo'}).then(function () {
        var otherDB = new PouchDB('mydb');
        return db.info().then(function (info1) {
          return otherDB.info().then(function (info2) {
            info1.doc_count.should.not.equal(info2.doc_count);
            return otherDB.destroy();
          }).then(function () {
            return db.destroy();
          });
        });
      });
    });


    it('should inform us when using memdown', function () {
      var opts = { name: 'mydb', db: require('memdown') };
      var db = new PouchDB(opts);
      return db.info().then(function (info) {
        info.backend_adapter.should.equal('MemDOWN');
      });
    });

    it('constructor emits destroyed when using defaults', function () {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});

      var db = new CustomPouch('mydb');
      return new testUtils.Promise(function (resolve) {
        CustomPouch.once('destroyed', function (name) {
          name.should.equal('mydb');
          resolve();
        });
        db.destroy();
      });
    });

    it('db emits destroyed when using defaults', function () {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});

      var db = new CustomPouch('mydb');
      return new testUtils.Promise(function (resolve) {
        db.once('destroyed', resolve);
        db.destroy();
      });
    });

    it('constructor emits creation event', function (done) {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});

      CustomPouch.once('created', function (name) {
        name.should.equal('mydb', 'should be same thing');
        done();
      });
      new PouchDB('mydb');
    });

    // somewhat odd behavior (CustomPouch constructor always mirrors PouchDB),
    // but better to test it explicitly
    it('PouchDB emits destroyed when using defaults', function () {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});

      var db = new CustomPouch('mydb');
      return new testUtils.Promise(function (resolve) {
        PouchDB.once('destroyed', function (name) {
          name.should.equal('mydb');
          resolve();
        });
        db.destroy();
      });
    });

    // somewhat odd behavior (CustomPouch constructor always mirrors PouchDB),
    // but better to test it explicitly
    it('PouchDB emits created when using defaults', function (done) {
      var CustomPouch = PouchDB.defaults({db: require('memdown')});

      PouchDB.once('created', function (name) {
        name.should.equal('mydb', 'should be same thing');
        done();
      });
      new CustomPouch('mydb');
    });

    it('should be transitive (#5922)', function () {
      var CustomPouch = PouchDB
        .defaults({db: require('memdown')})
        .defaults({});

      var db = new CustomPouch('mydb');
      return db.info().then(function (info) {
        info.backend_adapter.should.equal('MemDOWN');
      });
    });
  });
}
