function delay (time) {
  return new Promise((resolve) => setTimeout(resolve, time))
}

async function loadFromMock3Box (key) {
  const res = await window.fetch('http://localhost:8889?key=' + key)
  const text = await res.text()
  return text.length ? JSON.parse(text) : null
}

async function saveToMock3Box (key, newDataAtKey) {
  const res = await window.fetch('http://localhost:8889', {
    method: 'POST',
    body: JSON.stringify({
      key,
      data: newDataAtKey,
    }),
  })

  return res.text()
}

class Mock3Box {
  static openBox (address) {
    this.address = address
    return Promise.resolve({
      onSyncDone: (cb) => {
        setTimeout(cb, 200)
      },
      openSpace: async (spaceName, config) => {
        const { onSyncDone } = config
        this.spaceName = spaceName

        setTimeout(onSyncDone, 150)

        await delay(50)

        return {
          private: {
            get: async (key) => {
              await delay(50)
              const res = await loadFromMock3Box(`${this.address}-${this.spaceName}-${key}`)
              return res
            },
            set: async (key, data) => {
              await saveToMock3Box(`${this.address}-${this.spaceName}-${key}`, data)
              await delay(50)
              return null
            },
          },
        }
      },
      logout: () => {},
    })
  }

  static async getConfig (address) {
    const backup = await loadFromMock3Box(`${address}-metamask-metamaskBackup`)
    return backup
      ? { spaces: { metamask: {} } }
      : {}
  }
}

module.exports = Mock3Box