class app.Settings
  SETTINGS_KEY = 'settings'
  DOCS_KEY = 'docs'
  DARK_KEY = 'dark'
  LAYOUT_KEY = 'layout'
  SIZE_KEY = 'size'

  @defaults:
    count: 0
    hideDisabled: false
    hideIntro: false
    news: 0
    autoUpdate: true
    schema: 0

  constructor: (@store) ->
    @create() unless @settings = @store.get(SETTINGS_KEY)

  create: ->
    @settings = $.extend({}, @constructor.defaults)
    @applyLegacyValues @settings
    @save()
    return

  applyLegacyValues: (settings) ->
    for key, v of settings when (value = @store.get(key))?
      settings[key] = value
      @store.del(key)
    return

  save: ->
    @store.set SETTINGS_KEY, @settings

  set: (key, value) ->
    @settings[key] = value
    @save()

  get: (key) ->
    @settings[key] ? @constructor.defaults[key]

  hasDocs: ->
    try !!Cookies.get DOCS_KEY

  getDocs: ->
    try
      Cookies.get(DOCS_KEY)?.split('/') or app.config.default_docs
    catch
      app.config.default_docs

  setDocs: (docs) ->
    try
      Cookies.set DOCS_KEY, docs.join('/'), path: '/', expires: 1e8
    catch
    return

  setDark: (value) ->
    try
      if value
        Cookies.set DARK_KEY, '1', path: '/', expires: 1e8
      else
        Cookies.expire DARK_KEY
    catch
    return

  setLayout: (name, enable) ->
    try
      layout = (Cookies.get(LAYOUT_KEY) || '').split(' ')
      $.arrayDelete(layout, '')

      if enable
        layout.push(name) if layout.indexOf(name) is -1
      else
        $.arrayDelete(layout, name)

      if layout.length > 0
        Cookies.set LAYOUT_KEY, layout.join(' '), path: '/', expires: 1e8
      else
        Cookies.expire LAYOUT_KEY
    catch
    return

  setSize: (value) ->
    try
      Cookies.set SIZE_KEY, value, path: '/', expires: 1e8
    catch
    return

  reset: ->
    try Cookies.expire DOCS_KEY
    try Cookies.expire DARK_KEY
    try Cookies.expire LAYOUT_KEY
    try Cookies.expire SIZE_KEY
    try @store.del(SETTINGS_KEY)
    return
