'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 fs = require('fs');
  var ncp = require('ncp').ncp;

  ncp.limit = 16;

  describe('migration one', function () {
    beforeEach(function (done) {
      var input =
        fs.createReadStream('./tests/integration/leveldb/oldStyle.uuid');
      input.on('end', function () {
        ncp('./tests/integration/leveldb/oldStyle',
            './tmp/_pouch_oldStyle', done);
      });
      input.pipe(fs.createWriteStream('./tmp/_pouch_oldStyle.uuid'));
    });
    it('should work', function () {
      var db = new PouchDB('oldStyle');
      return db.get('doc').then(function (doc) {
        doc.something.should.equal('awesome');
        return db.destroy();
      });
    });
  });
  describe('migration two', function () {
    beforeEach(function (done) {
      ncp('./tests/integration/leveldb/middleStyle',
          './tmp/_pouch_middleStyle', done);
    });
    it('should work', function () {
      var db = new PouchDB('middleStyle');
      return db.id().then(function (id) {
        id.should.equal('8E049E64-784A-3209-8DD6-97C29D7A5868');
        return db.get('_local/foo');
      }).then(function (resp) {
        resp.something.should.equal('else');
        return db.allDocs();
      }).then(function (resp) {
        resp.total_rows.should.equal(1);
        resp.rows[0].id.should.equal('_design/foo');
        return db.destroy();
      });
    });
  });

  // sanity check to ensure we don't actually need to migrate
  // attachments for #2818
  describe('#2818 no migration needed for attachments', function () {
    beforeEach(function (done) {
      ncp('./tests/integration/leveldb/lateStyle',
          './tmp/_pouch_lateStyle', done);
    });
    it('should work', function () {
      var db = new PouchDB('lateStyle', { auto_compaction: false });
      return db.put({
        _id: 'doc_b',
        _attachments: {
          'att.txt': {
            data: 'Zm9v', // 'foo'
            content_type: 'text/plain'
            }
        }
      }).then(function () {
        return db.get('doc_b');
      }).then(function (doc) {
        return db.remove(doc);
      }).then(function () {
        return db.compact();
      }).then(function () {
        return db.get('doc_a', {attachments: true});
      }).then(function (doc) {
        doc._attachments['att.txt'].data.should.equal('Zm9vYmFy');
        doc._attachments['att2.txt'].data.should.equal('Zm9vYmFy');
        doc._attachments['att3.txt'].data.should.equal('Zm9v');
        return db.destroy();
      });
    });
  });

  // Sanity check for the fix in 3136 that guards against successive
  // new_edits to the same rev, ensuring it ignores duplicates.
  //
  // In the olden days, <=3.2.0, if you bulk-pushed with new_edits=false
  // the same rev multiple times, LevelDB would keep incrementing the seq
  // and keep writing new revs. This was fixed, but when we do _changes,
  // we have to guard against these duplicate seqs for backwards compat.
  //
  // This test is very similar to the test.bulk_docs.js test:
  // 'Testing successive new_edits to the same doc, different content'

  describe('#3136 no migration needed for overwritten revs', function () {
    beforeEach(function (done) {
      ncp('./tests/integration/leveldb/laterStyle',
        './tmp/_pouch_laterStyle', done);
    });
    it('should work', function () {
      var db = new PouchDB('laterStyle');

      // basically this a db where I did a very pathological thing:
      //var docsA = [{
      //  '_id': 'foo',
      //  '_rev': '1-x',
      //  'bar' : 'baz',
      //  '_revisions': {
      //    'start': 1,
      //    'ids': ['x']
      //  }
      //}, {
      //  '_id' : 'fee',
      //  '_rev': '1-x',
      //  '_revisions': {
      //    'start': 1,
      //    'ids': ['x']
      //  }
      //}];
      //var docsB = [{
      //  '_id': 'foo',
      //  '_rev': '1-x',
      //  'bar' : 'zam', // this update should be rejected
      //  '_revisions': {
      //    'start': 1,
      //    'ids': ['x']
      //  }
      //}];
      //
      //db.bulkDocs(docsA, {new_edits: false});
      //db.bulkDocs(docsB, {new_edits: false});


      return db.changes({
        include_docs: true,
        return_docs: true
      }).then(function (result) {
        // the important thing is that 'zam' is ignored. see
        // the other test in test.bulk_docs.js for details
        var expected = {
          "results": [{
            "id": "fee",
            "changes": [{"rev": "1-x"}],
            "doc": {"_id": "fee", "_rev": "1-x"},
            "seq": 1
          }, {
            "id": "foo",
            "changes": [{"rev": "1-x"}],
            "doc": {"bar": "baz", "_id": "foo", "_rev": "1-x"},
            "seq": 2
          }],
          "last_seq": 2
        };
        result.should.deep.equal(expected);
        return db.destroy();
      });
    });
  });
}
