var common     = require('../../common');
var connection = common.createConnection();
var assert     = require('assert');

var table = 'load_data_test';
connection.query([
  'CREATE TEMPORARY TABLE `' + table + '` (',
  '`id` int(11) unsigned NOT NULL AUTO_INCREMENT,',
  '`title` varchar(255),',
  'PRIMARY KEY (`id`)',
  ') ENGINE=InnoDB DEFAULT CHARSET=utf8'
].join('\n'));

var path = './test/fixtures/data.csv';
var sql =
  'LOAD DATA LOCAL INFILE ? INTO TABLE ' + table + ' ' +
  'FIELDS TERMINATED BY ? (id, title)';

var ok;
connection.query(sql, [path, ','], function(err, _ok) {
  if (err) throw err;
  ok = _ok;
});

var rows;
connection.query('SELECT * FROM ' + table, function(err, _rows) {
  if (err) throw err;
  rows = _rows;
});

// Try to load a file that does not exist to see if we handle this properly
var loadErr;
var loadResult;
var badPath = '/does_not_exist.csv';

connection.query(sql, [badPath, ','], function(err, result) {
  loadErr    = err;
  loadResult = result;
});

// test path mapping
var Stream = require('readable-stream').PassThrough;
var myStream = new Stream();

var createMyStream = function(path) { return myStream; };
var streamResult;
connection.query({
    sql: sql,
    values: [badPath, ','],
    infileStreamFactory: createMyStream
  }, function(err, result) {
    if (err) throw err;
    streamResult = result;
  }
);
myStream.write('11,Hello World\n');
myStream.write('21,One ');
myStream.write('more row\n');
myStream.end();

connection.end();

process.on('exit', function() {
  assert.equal(ok.affectedRows, 4);
  assert.equal(rows.length, 4);
  assert.equal(rows[0].id, 1);
  assert.equal(rows[0].title, 'Hello World');

  assert.equal(loadErr.code, 'ENOENT');
  assert.equal(loadResult.affectedRows, 0);

  assert.equal(streamResult.affectedRows, 2);
});
