/**
* MIT License
*
* Copyright (c) 2020 wompmacho
* 
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
* 
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
* 
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/


class Storage {

  get(keys = null) {
    return new Promise((res, rej) => {
      const returnSingle = typeof keys === 'string' || typeof keys === 'number';
      // resolve args = items:object
      chrome.storage[this.store].get(keys, (items) => {
        if(returnSingle) {
          res(items[keys]);
        } else {
          res(items);
        }
      });
    });
  }

  getBytesInUse(keys = null) {
    return new Promise((res, rej) => {
      // resolve args = bytesInUse:integer
      chrome.storage[this.store].getBytesInUse(keys, res);
    });
  }

  set(items) {
    return new Promise((res, rej) => {
      // resolve args = (none)
      chrome.storage[this.store].set(items, res);
    });
  }

  remove(keys) {
    // resolve args = (none)
    return new Promise((res, rej) => {
      chrome.storage[this.store].remove(keys, res);
    });
  }

  clear() {
    // resolve args = (none)
    return new Promise((res, rej) => {
      chrome.storage[this.store].clear(res);
    });
  }

  listen(item, onChange) {
    if(typeof item === 'function') {
      onChange = item;
      item = null;
    }

    chrome.storage.onChanged.addListener((changes, areaName) => {
      if(areaName === this.store) {
        if(item !== null) {
          if(changes.hasOwnProperty(item)) {
            const oldValue = changes[item].oldValue || null;
            const newValue = changes[item].newValue || null;
            onChange(oldValue, newValue);
          }
        } else {
          onChange(changes);
        }
      }
    });
  }
}

export default Storage;
