'use strict';
const deepSet = require('lodash').set
const reach = require('../utils/reach')
const logger = require('debug')('dataparty.config.local-storage');
const IConfig = require('./iconfig')
/**
 * @class  module:Config.LocalStorageConfig
 * @implements {module:Config.IConfig}
 * @link module.Config
 */
class LocalStorageConfig extends IConfig {
  constructor(defaults, whitelist){
    super()
    this.whitelist = whitelist || []
    defaults = defaults || {}
    this.basePath = defaults.basePath || 'dataparty-api'
    this.defaults = defaults || {}
    this.defaults.logicalSeparator = '.'
  }
  async start () {
    return this
  }
  async clear () {
    localStorage.setItem(this.basePath, JSON.stringify({}))
  }
  async readAll(){
    try{
      return Object.assign(
        {},
        this.defaults,
        JSON.parse( localStorage.getItem(this.basePath) || '{}' )
      )
    }
    catch(err){
      return {}
    }
  }
  async read(key){
    logger('reading path: ' + key)
    return reach( await this.readAll(), key)
  }
  async write(key, value){
    let data = await this.readAll()
    deepSet(data, key, value)
    localStorage.setItem(this.basePath, JSON.stringify(data))
    return
  }
  async exists(key){
    return (await read(key)) !== undefined
  }
  async save(){
    return
  }
}
module.exports = LocalStorageConfig