const EventEmitter = require('events')

class VerifyContracts extends EventEmitter {
  command (compiledContractNames, opts = { wait: 1000, version: null }) {
    this.api.perform((done) => {
      verifyContracts(this.api, compiledContractNames, opts, () => {
        done()
        this.emit('complete')
      })
    })
    return this
  }
}

function getCompiledContracts (browser, opts, callback) {
  browser
  .clickLaunchIcon('solidity')
  .pause(opts.wait)
  .waitForElementPresent('*[data-id="compiledContracts"] option')
  .perform((done) => {
    if (opts.version) {
      browser
      .click('*[data-id="compilation-details"]')
      .waitForElementVisible('*[data-id="treeViewDivcompiler"]')
      .pause(2000)
      .click('*[data-id="treeViewDivcompiler"]')
      .waitForElementVisible('*[data-id="treeViewLicompiler/version"]')
      .assert.containsText('*[data-id="treeViewLicompiler/version"]', `version: ${opts.version}`)
      .perform(done)
    } else done()
  })
  .execute(function () {
    var contracts = document.querySelectorAll('*[data-id="compiledContracts"] option')
    if (!contracts) {
      return null
    } else {
      var ret = []
      for (var c = 0; c < contracts.length; c++) {
        ret.push(contracts[c].value)
      }
      return ret
    }
  }, [], function (result) {
    callback(result)
  })
}

function verifyContracts (browser, compiledContractNames, opts, callback) {
  getCompiledContracts(browser, opts, (result) => {
    if (result.value) {
      for (var contract in compiledContractNames) {
        console.log(' - ' + compiledContractNames[contract], result.value)
        if (result.value.indexOf(compiledContractNames[contract]) === -1) {
          browser.assert.fail('compiled contract ' + compiledContractNames + ' not found', 'info about error', '')
          browser.end()
          return
        }
      }
    } else {
      browser.assert.fail('compiled contract ' + compiledContractNames + ' not found - none found', 'info about error', '')
      browser.end()
    }
    console.log('contracts all found ' + compiledContractNames)
    callback()
  })
}

module.exports = VerifyContracts
