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

function mew(): WalletInit {
  return () => {
    return {
      label: 'MEW Wallet',
      getIcon: async () => (await import('./icon.js')).default,
      getInterface: async ({ chains, EventEmitter }) => {
        const {
          createEIP1193Provider,
          ProviderRpcError,
          ProviderRpcErrorCode
        } = await import('@web3-onboard/common')

        const { firstValueFrom, fromEvent } = await import('rxjs')
        const { map, take } = await import('rxjs/operators')

        const { default: MEWWallet } = await import(
          '@myetherwallet/mewconnect-web-client'
        )

        const [chain] = chains
        const mewConnect = new MEWWallet.Provider({
          windowClosedError: true,
          chainId: parseInt(chain.id),
          rpcUrl: chain.rpcUrl
        })

        const disconnected$ = fromEvent(mewConnect, 'disconnect')

        const mewProvider: EIP1193Provider = mewConnect.makeWeb3Provider()
        const provider = createEIP1193Provider(mewProvider, {
          eth_requestAccounts: ({ baseRequest }) => {
            const closed$ = fromEvent(mewConnect, 'popupWindowClosed').pipe(
              map(() => {
                throw new ProviderRpcError({
                  code: ProviderRpcErrorCode.ACCOUNT_ACCESS_REJECTED,
                  message: 'Popup window closed'
                })
              }),
              take(1)
            )

            return Promise.race([
              baseRequest({ method: 'eth_requestAccounts' }),
              firstValueFrom(closed$)
            ])
          },
          eth_selectAccounts: null,
          wallet_addEthereumChain: null,
          wallet_switchEthereumChain: null
        })

        const events = new EventEmitter()

        disconnected$.pipe(take(1)).subscribe(() => {
          events.emit('accountsChanged', [])
        })

        provider.disconnect = () => mewConnect.disconnect()
        provider.on = events.on.bind(events)

        return {
          provider
        }
      }
    }
  }
}

/**
 * @deprecated Use @web3-onboard/mew-wallet
 */
export default mew
