"use strict";
var r = require("rethinkdb")
var Query = require("./query")

module.exports = class Table {
  constructor(conn, name) {
    this.conn = conn
    this.table = r.db(conn.db).table(name)
    this.table.conn = conn // for native method
  }

  insert(data, cb) {
    this.table.insert(data, {returnChanges: true}).run(this.conn, (err, result) => {
      if (err) return cb(err)
      if (result.errors > 0) return cb(new Error(result.first_error))
      cb(null, result.changes[0].new_val)
    })
  }

  insertEach(data, cb) {
    if (data.length === 0)
      return cb(null, [])
    this.table.insert(data, {returnChanges: true}).run(this.conn, (err, result) => {
      if (err) return cb(err)
      if (result.errors > 0) return cb(new Error(result.first_error))
      cb(null, result.changes.map(v => v.new_val))
    })
  }

  find(query, cb) {
    Query.build(this.table, query).run(this.conn, (err, cursor) => {
      if (err) return cb(err)
      cursor.toArray(cb)
    })
  }

  update(query, data, cb) {
    Query.build(this.table, query).update(data, {returnChanges: true}).run(this.conn, (err, result) => {
      if (err) return cb(err)
      if (result.errors > 0) return cb(new Error(result.first_error))
      cb(null, result.changes[0].new_val)
    })
  }

  destroy(query, cb) {
    Query.build(this.table, query).delete({returnChanges: true}).run(this.conn, (err, result) => {
      if (err) return cb(err)
      if (result.errors > 0) return cb(new Error(result.first_error))
      if (result.deleted > 0) {
        cb(null, result.changes.map(v => v.old_val.id))
      } else {
        cb(null, [])
      }
    })
  }

  count(query, cb) {
    Query.build(this.table, query).count().run(this.conn, (err, result) => {
      if (err) return cb(err)
      cb(null, result)
    })
  }


  join(query, cb) {
    Query.build(this.table, query).run(this.conn, (err, cursor) => {
      if (err) return cb(err)
      cursor.toArray(cb)
    })
  }
}

@@ -456,32 +456,54 @@
 )%0A      cb(null,
+ result.inserted %3E 0 ?
  result.changes%5B
@@ -504,32 +504,39 @@
 anges%5B0%5D.new_val
+ : null
 )%0A    %7D)%0A  %7D%0A%0A  
@@ -802,32 +802,54 @@
 )%0A      cb(null,
+ result.inserted %3E 0 ?
  result.changes.
@@ -867,16 +867,21 @@
 new_val)
+ : %5B%5D
 )%0A    %7D)
@@ -1281,32 +1281,54 @@
 )%0A      cb(null,
+ result.replaced %3E 0 ?
  result.changes%5B
@@ -1337,16 +1337,21 @@
 .new_val
+ : %5B%5D
 )%0A    %7D)
@@ -1580,28 +1580,33 @@
 ror))%0A      
-if (
+cb(null, 
 result.delet
@@ -1615,28 +1615,10 @@
  %3E 0
-) %7B%0A        cb(null,
+ ?
  res
@@ -1655,53 +1655,14 @@
 .id)
-)%0A      %7D else %7B%0A        cb(null, %5B%5D)%0A      %7D
+ : %5B%5D)
 %0A   

fix insert bug