/* Import modules. */
import BCHJS from '@psf/bch-js'
import { Transaction } from 'bitcoinjs-lib'
import { mnemonicToSeed } from '@nexajs/hdnode'
import { encodeNullData } from '@nexajs/script'
import { utf8ToBin } from '@nexajs/utils'

const bchjs = new BCHJS()

/**
 * Build Shared Transaction
 *
 * Combine all participating inputs and outputs into one (signed) transaction.
 *
 * NOTE: ALL inputs are ALREADY signed by their respective participants.
 */
export default function (_inputs, _outputs) {
    /* Initialize locals. */
    let rawTx
    let safeBalance
    let utxo

    const transactionBuilder = new bchjs.TransactionBuilder()
let inputIdx
    this.fusionInputs.forEach((_utxo) => {
        /* Set UTXO. */
        utxo = _utxo
        console.log('UTXO', utxo)
inputIdx = 0//utxo.tx_pos
        transactionBuilder.addInput(utxo.tx_hash, utxo.tx_pos)

        const originalAmount = utxo.value

        const remainder = originalAmount - satsNeeded
        console.log('REMAINDER', remainder);

        if (remainder < 0) {
            throw new Error('Selected UTXO does not have enough satoshis')
        }


        const protocolId = '1337'
        const msg = 'building...'

        const script = [
            utf8ToBin(protocolId),
            utf8ToBin(msg),
        ]
        console.log('my SCRIPT', script)
        console.log('encodeNullData', encodeNullData(script))

        // Compile the script array into a bitcoin-compliant hex encoded string.
        // const data = bchjs.Script.encode(script)
        const data = Buffer.from(encodeNullData(script))
        console.log('OP_RETURN (data)', data)

        // Add the OP_RETURN output.
        // transactionBuilder.addOutput(data, 0)
        transactionBuilder.addOutput(data, 0)



        // Send payment
        // transactionBuilder.addOutput(receiver, satsNeeded)
        transactionBuilder.addOutput(receiver, paymentAmount)

        // Send the BCH change back to the payment part
        // transactionBuilder.addOutput(account.address, remainder - 300)
    })

    /* Initialize redeem script. */
    // FIXME Why do we need this??
    let redeemScript

    /* Convert mnemonic to seed. */
    const seed = mnemonicToSeed(this.mnemonic)

    /* Conver to seed buffer. */
    // FIXME Migrate to TypedArrays.
    const seedBuffer = Buffer.from(seed, 'hex')

    /* Generate master node. */
    const masterNode = bchjs.HDNode.fromSeed(seedBuffer)

/* Set account index. */
const accountIdx = 0
/* Set change index. */
const changeIdx = 0
/* Set address index. */
const addressIdx = 0

    /* Generate child node. */
    const chidleNode = masterNode
        .derivePath(`m/44'/145'/${accountIdx}'/${changeIdx}/${addressIdx}`)

    /* Generate wallet import format (WIF). */
    const wif = bchjs.HDNode.toWIF(chidleNode)
    // console.log('BCH WIF', wif)

    /* Generate elliptic pair. */
    const ecPair = bchjs.ECPair.fromWIF(wif)

    /* Sign transaction. */
    transactionBuilder.sign(
        inputIdx,
        ecPair,
        redeemScript,
        Transaction.SIGHASH_ALL,
        utxo.value,
    )

    /* Generate (incomplete) transaction. */
    const tx = transactionBuilder.transaction.buildIncomplete()
    // console.log('TRANSACTION', tx)

    /* Convert to (raw) hex. */
    rawTx = tx.toHex()

    /* Return raw (hex) transaction. */
    return rawTx
}
