var Promise = Ember.RSVP.Promise;

function classToString(klass) {
  return klass.toString().split('.')[1];
}

function key(klass, id) {
  return classToString(klass) + '-' + id;
}

Ember.LocalStorageAdapter = Ember.Adapter.extend({
  find: function(record, id) {
    var data = this._getItem(record.constructor, id);

    return new Promise(function(resolve, reject) {
      if (data) {
        record.load(id, data);
        resolve(record);
      } else {
        reject(record);
      }
    });
  },

  findAll: function(klass, records) {
    var self = this;

    return new Promise(function(resolve, reject) {
      var ids = localStorage[classToString(klass) + '!ids'],
          data = [];

      if (ids) {
        ids = ids.split(',');

        for (var i = 0, l = ids.length; i < l; i++) {
          data.push(self._getItem(klass, ids[i]));
        }
      }

      records.load(klass, data);
      resolve(records);
    });
  },

  createRecord: function(record) {
    var self = this,
        klass = record.constructor;

    return new Promise(function(resolve, reject) {
      var newId = localStorage[classToString(klass) + '!nextId'] || "1";
      record.set(klass.primaryKey, newId);
      self._setItem(klass, newId, record.toJSON());

      self._updateIds(klass, newId);

      localStorage[classToString(klass) + '!nextId'] = parseInt(newId, 10) + 1;
      record.didCreateRecord();
      resolve(record);
    });
  },

  saveRecord: function(record) {
    var self = this,
        klass = record.constructor;

    return new Promise(function(resolve, reject) {
      self._setItem(klass, record.get(klass.primaryKey), record.toJSON());
      record.didSaveRecord();
      resolve(record);
    });
  },

  deleteRecord: function(record) {
    var self = this,
        klass = record.constructor;

    return new Promise(function(resolve, reject) {
      self._deleteItem(klass, record.get(klass.primaryKey));
      record.didDeleteRecord();
      resolve(record);
    });
  },

  _getItem: function(klass, id) {
    var value = localStorage[key(klass, id)];
    return value && JSON.parse(value);
  },

  _setItem: function(klass, id, data) {
    localStorage[key(klass, id)] = JSON.stringify(data);
  },

  _deleteItem: function(klass, id) {
    delete localStorage[key(klass, id)];

    var idsKey = classToString(klass) + '!ids',
        ids = localStorage[idsKey].split(',');

    for (var i = 0, l = ids.length; i < l; i++) {
      if (ids[i] === ''+id) { // handling id being a number or string
        ids.splice(i, 1);
        break;
      }
    }

    localStorage[idsKey] = ids.join(',');
  },

  _updateIds: function(klass, newId) {
    var key = classToString(klass) + '!ids',
        currentIds = localStorage[key];
    if (currentIds) {
      localStorage[key] += ',' + newId;
    } else {
      localStorage[key] = newId;
    }
  }
});