const contracts = require('@unlock-protocol/contracts')

const { ethers } = require('hardhat')

const md = (sigs) => {
  // show markdown array on screen
  console.log('| Type | Name | SigHash |')
  console.log('|---|---|---|')
  sigs.forEach(([type, name, sighash]) =>
    console.log(`| ${type} | ${name} | ${sighash} |`)
  )
}

const sigs = (abi) => {
  const { functions, events } = abi
  const sigFuncs = Object.keys(functions).map((d) => [
    'function',
    d,
    abi.getSighash(functions[d]),
  ])

  const sigEvents = Object.keys(events).map((d) => [
    'events',
    d,
    abi.getSighash(events[d]),
  ])
  return [...sigFuncs, ...sigEvents]
}

async function main() {
  const contractNames = [
    ['Unlock', 9],
    ['Unlock', 10],
    ['Unlock', 11],
    ['PublicLock', 8],
    ['PublicLock', 9],
    ['PublicLock', 10]
  ]

  console.log('# Unlock contracts 4-bytes signatures \n')
  
  for (let i = 0; i < contractNames.length; i++) {
    const [contractName, version] = contractNames[i];
    
    const { abi: jsonAbi, bytecode } = contracts[`${contractName}V${version}`]
    const { interface: abi } = await ethers.getContractFactory(jsonAbi, bytecode)
    
    console.log(
      `\n ## ${contractName} v${version} \n`
    )
    md(sigs(abi))
  }

}

// execute as standalone
if (require.main === module) {
  /* eslint-disable promise/prefer-await-to-then, no-console */
  main()
    .then(() => process.exit(0))
    .catch((error) => {
      console.error(error)
      process.exit(1)
    })
}

module.exports = main