import { observers } from './observers/observers'
import { computations } from './computations/computations'
import { mixins } from './mixins/mixins'
import { LocalStorageStore } from './LocalStorageStore'
import { observe } from 'svelte-extras'

const persistedState = {
  autoplayGifs: false,
  composeData: {},
  currentInstance: null,
  currentRegisteredInstanceName: undefined,
  currentRegisteredInstance: undefined,
  disableCustomScrollbars: false,
  disableLongAriaLabels: false,
  disableTapOnStatus: false,
  largeInlineMedia: false,
  instanceNameInSearch: '',
  instanceThemes: {},
  loggedInInstances: {},
  loggedInInstancesInOrder: [],
  markMediaAsSensitive: false,
  neverMarkMediaAsSensitive: false,
  omitEmojiInDisplayNames: undefined,
  pinnedPages: {},
  pushSubscription: null,
  reduceMotion:
    !process.browser ||
    window.matchMedia('(prefers-reduced-motion: reduce)').matches
}

const nonPersistedState = {
  customEmoji: {},
  instanceInfos: {},
  instanceLists: {},
  online: !process.browser || navigator.onLine,
  pinnedStatuses: {},
  pushNotificationsSupport:
    process.browser &&
    ('serviceWorker' in navigator &&
      'PushManager' in window &&
      'getKey' in window.PushSubscription.prototype),
  queryInSearch: '',
  repliesShown: {},
  sensitivesShown: {},
  spoilersShown: {},
  statusModifications: {},
  verifyCredentials: {}
}

const state = Object.assign({}, persistedState, nonPersistedState)
const keysToStoreInLocalStorage = new Set(Object.keys(persistedState))

class PinaforeStore extends LocalStorageStore {
  constructor (state) {
    super(state, keysToStoreInLocalStorage)
  }
}

PinaforeStore.prototype.observe = observe

export const store = new PinaforeStore(state)

mixins(PinaforeStore)
computations(store)
observers(store)

if (process.browser && process.env.NODE_ENV !== 'production') {
  window.store = store // for debugging
}

// needed for tests
if (process.browser) {
  window.__forceOnline = online => store.set({ online })
}