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: () => undefined,
    })
  }

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

module.exports = Mock3Box
