'use strict'

const duplexPair = require('it-pair/duplex')
const abortable = require('abortable-iterator')
const AbortController = require('abort-controller')

/**
 * Returns both sides of a mocked MultiaddrConnection
 *
 * @param {object} options
 * @param {Multiaddr[]} options.addrs - Should contain two addresses for the local and remote peer
 * @param {PeerId} options.remotePeer - The peer that is being "dialed"
 * @returns {{inbound:MultiaddrConnection, outbound:MultiaddrConnection}}
 */
module.exports = function mockMultiaddrConnPair ({ addrs, remotePeer }) {
  const controller = new AbortController()
  const [localAddr, remoteAddr] = addrs

  const [inbound, outbound] = duplexPair()
  outbound.localAddr = localAddr
  outbound.remoteAddr = remoteAddr.encapsulate(`/p2p/${remotePeer.toB58String()}`)
  outbound.timeline = {
    open: Date.now()
  }
  outbound.close = () => {
    outbound.timeline.close = Date.now()
    controller.abort()
  }

  inbound.localAddr = remoteAddr
  inbound.remoteAddr = localAddr
  inbound.timeline = {
    open: Date.now()
  }
  inbound.close = () => {
    inbound.timeline.close = Date.now()
    controller.abort()
  }

  // Make the sources abortable so we can close them easily
  inbound.source = abortable(inbound.source, controller.signal)
  outbound.source = abortable(outbound.source, controller.signal)

  return { inbound, outbound }
}