// Collection-based implementation of Dispatcher.

'use strict';

var _ = require('lodash');
var inherits = require('util').inherits;

var Collection = require('./collection');
var Dispatcher = require('./dispatcher');

inherits(CollectionDispatcher, Dispatcher);
module.exports = CollectionDispatcher;

function noop() {}

function CollectionDispatcher(lists, todos) {
  Dispatcher.call(this);
  console.assert(lists instanceof Collection);
  console.assert(todos instanceof Collection);
  this.lists_ = lists;
  this.todos_ = todos;
}

CollectionDispatcher.prototype.getLists = function(cb) {
  this.lists_.find({}, {sort: {name: 1}}, cb);
};

CollectionDispatcher.prototype.getTodos = function(listId, cb) {
  this.todos_.find({listId: listId}, {sort: {timestamp: 1}}, cb);
};

CollectionDispatcher.prototype.addList = function(list, cb) {
  this.lists_.insert(list, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.editListName = function(listId, name, cb) {
  this.lists_.update(listId, {$set: {name: name}}, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.addTodo = function(listId, todo, cb) {
  todo = _.assign({}, todo, {listId: listId});
  this.todos_.insert(todo, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.removeTodo = function(todoId, cb) {
  this.todos_.remove(todoId, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.editTodoText = function(todoId, text, cb) {
  this.todos_.update(todoId, {$set: {text: text}}, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.markTodoDone = function(todoId, done, cb) {
  this.todos_.update(todoId, {$set: {done: done}}, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.addTag = function(todoId, tag, cb) {
  this.todos_.update(todoId, {$addToSet: {tags: tag}}, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.removeTag = function(todoId, tag, cb) {
  this.todos_.update(todoId, {$pull: {tags: tag}}, this.maybeEmit_(cb));
};

CollectionDispatcher.prototype.maybeEmit_ = function(cb) {
  var that = this;
  cb = cb || noop;
  return function(err) {
    cb.apply(null, arguments);
    if (!err) that.emit('change');
  };
};
