/* tslint:disable: no-console */
const _ = require('lodash');
const exec = require('shell-utils').exec;

const release = _.includes(process.argv, '--release');

// Run just a single test, e.g. npm test-e2e-android -- --just com.MyClass#myMethod
const filter = _.chain(process.argv).dropWhile((a) => a !== '--just').take(2).last().value();

run();

function run() {
  if (process.env.CI) {
    console.log(`android e2e is disabled on CI until Travis will support x86 emulators or we migrate to our own solution`);
  } else {
    assertEnv();
    if (!isDeviceRunning()) {
      startEmulator();
    }
    runTests();
  }
}

function assertEnv() {
  if (_.isEmpty(process.env.ANDROID_HOME)) {
    throw new Error(`$ANDROID_HOME is not defined`);
  }
}

function isDeviceRunning() {
  try {
    const response = exec.execSyncRead(`adb -e shell getprop init.svc.bootanim 2>&1`);
    return _.isEqual(response, `stopped`);
  } catch (err) {
    return false;
  }
}

function startEmulator() {
  console.log(`Looking for avd...`);
  const avdsRaw = exec.execSyncRead(`${process.env.ANDROID_HOME}/tools/bin/avdmanager list avd -c`);
  const avdName = /^.*package\.xml(\S+)$/m.exec(avdsRaw)[1];
  if (_.isEmpty(avdName)) {
    throw new Error(`Can't find avd to launch. Please create an avd first.`);
  }
  console.log(`found avd name: ${avdName}, Launching...`);
  exec.execAsyncSilent(`${process.env.ANDROID_HOME}/tools/emulator -gpu host -no-audio @${avdName}`);
  exec.execSync(`./scripts/waitForAndroidEmulator.sh`);
}

function runTests() {
  exec.execSync(`npm run uninstall-android`);
  exec.execSync(`npm run install-android ${release ? '-- --release' : ''}`);
  const filterParam = filter ? '-Pandroid.testInstrumentationRunnerArguments.class=' + filter : '';
  exec.execSync(`cd AndroidE2E && ./gradlew ${filterParam} connectedDebugAndroidTest`);
}
