import { WalletInit } from '@web3-onboard/common'

async function getProvider() {
  const injected = (window as any).ethereum

  if (injected && injected.isFrame) {
    return injected
  }

  const { default: ethProvider } = await import('eth-provider')
  return ethProvider('frame')
}

function frame(): WalletInit {
  return () => {
    return {
      label: 'Frame',
      getIcon: async () => (await import('./icon.js')).default,
      getInterface: async () => {
        const provider = await getProvider()

        await new Promise(resolve => setTimeout(resolve, 100))

        if (!provider.connected) {
          throw new Error(
            'Frame App must be open with a hot wallet connected. If not installed first download the Frame App.'
          )
        }
        return {
          provider,
          interface: {
            connect: () =>
              provider
                .request({
                  method: 'eth_requestAccounts'
                })
                .catch((err: { message: string }) => {
                  if (err.message.includes('Unexpected end of JSON input')) {
                    throw new Error('Frame is not running')
                  }

                  throw err
                }),
            disconnect: provider.close
          }
        }
      },
      platforms: ['desktop']
    }
  }
}

export default frame
