## Nim-Codex
## Copyright (c) 2021 Status Research & Development GmbH
## Licensed under either of
##  * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
##  * MIT license ([LICENSE-MIT](LICENSE-MIT))
## at your option.
## This file may not be copied, modified, or distributed except according to
## those terms.

import std/math
import pkg/nitro
import pkg/questionable/results
import ../peers

export nitro
export results

push: {.upraises: [].}

const ChainId* = 0.u256 # invalid chain id for now
const Asset* = EthAddress.zero # invalid ERC20 asset address for now
const AmountPerChannel = (10'u64^18).u256 # 1 asset, ERC20 default is 18 decimals

func openLedgerChannel*(wallet: WalletRef,
                        hub: EthAddress,
                        asset: EthAddress): ?!ChannelId =
  wallet.openLedgerChannel(hub, ChainId, asset, AmountPerChannel)

func getOrOpenChannel(wallet: WalletRef, peer: BlockExcPeerCtx): ?!ChannelId =
  if channel =? peer.paymentChannel:
    success channel
  elif account =? peer.account:
    let channel = ?wallet.openLedgerChannel(account.address, Asset)
    peer.paymentChannel = channel.some
    success channel
  else:
    failure "no account set for peer"

func pay*(wallet: WalletRef,
          peer: BlockExcPeerCtx,
          amount: UInt256): ?!SignedState =
  if account =? peer.account:
    let asset = Asset
    let receiver = account.address
    let channel = ?wallet.getOrOpenChannel(peer)
    wallet.pay(channel, asset, receiver, amount)
  else:
    failure "no account set for peer"