/* jshint evil: true */
/* jshint ignore: start */

var chai = require('chai');
var expect = chai.expect;
var jsonexport = require('../lib/index');
var os = require('os');
var stream = require('stream');

function getWriteStream(done) {
  var write = new stream.Writable();
  var csv = "";
  write._write = function(chunk, enc, next) {
    chunk = chunk.toString();
    csv += chunk;
    next();
  };
  write.on('finish', () => {
    done(csv);
  });
  return write;
}

describe('Stream', () => {
  it('simple', (done) => {
    var read = new stream.Readable();
    var write = getWriteStream((csv) => {
      expect(csv).to.equal(`name,lastname,escaped${os.EOL}Bob,Smith${os.EOL}James,David,"I am a ""quoted"" field"`);
      done();
    });

    read.pipe(jsonexport()).pipe(write);

    read.push(JSON.stringify([{
      name: 'Bob',
      lastname: 'Smith'
    }, {
      name: 'James',
      lastname: 'David',
      escaped: 'I am a "quoted" field'
    }]));
    read.push(null);
  });
  it('simple with options', (done) => {
    var read = new stream.Readable();
    var write = getWriteStream((csv) => {
      expect(csv).to.equal(`name|lastname|escaped${os.EOL}Bob|Smith${os.EOL}James|David|"I am a ""quoted"" field"`);
      done();
    });

    read.pipe(jsonexport({
      rowDelimiter: '|'
    })).pipe(write);

    read.push(JSON.stringify([{
      name: 'Bob',
      lastname: 'Smith'
    }, {
      name: 'James',
      lastname: 'David',
      escaped: 'I am a "quoted" field'
    }]));
    read.push(null);
  });
  it('complex', (done) => {
    var read = new stream.Readable();
    var write = getWriteStream((csv) => {
      expect(csv).to.equal(`id,name,lastname,family.name,family.type${os.EOL}1,Bob,Smith,Peter,Father${os.EOL}2,James,David,Julie,Mother`);
      done();
    });

    read.pipe(jsonexport()).pipe(write);

    read.push(JSON.stringify([{
      id: 1,
      name: 'Bob',
      lastname: 'Smith',
      family: {
        name: 'Peter',
        type: 'Father'
      }
    }, {
      id: 2,
      name: 'James',
      lastname: 'David',
      family: {
        name: 'Julie',
        type: 'Mother'
      }
    }]));
    read.push(null);
  });
});