node('docker') {

  // build master periodically even if no changes made
  def triggers = []
  if(env.BRANCH_NAME == 'master') {
      triggers << cron('H 18 * * 6') // at 18:HH on Saturdays every Sunday Brisbane time
  }

  properties([
    parameters([
      string(
        defaultValue: '',
        description: 'The DoseMe::Util revision to use',
        name: 'util_revision'
      ),
      string(
        defaultValue: '',
        description: 'The DoseMe::Drugs revision to use',
        name: 'drugs_revision'
      )
    ]),
    pipelineTriggers(triggers)
  ])


  def util_revision;
  if (params.util_revision) {
    util_revision = params.util_revision;
  } else if (env.BRANCH_NAME =~ 'develop|feature.*') { // build develop and feature branches against develop of doseme-util unless version specified
    util_revision = 'develop';
  }

  def drugs_revision;
  if (params.drugs_revision) {
    drugs_revision = params.drugs_revision;
  } else if (env.BRANCH_NAME =~ 'develop|feature.*') { // build develop and feature branches against develop of doseme-drugs unless version specified
    drugs_revision = 'develop';
  }


  echo "Will use doseme-util revision: ${util_revision}, and doseme-drugs revision: ${drugs_revision}"

  stage('Checkout repo') {
    checkout(
      [
        $class: 'GitSCM',
        branches: scm.branches,
        doGenerateSubmoduleConfigurations: scm.doGenerateSubmoduleConfigurations,
        extensions: scm.extensions,
        userRemoteConfigs: scm.userRemoteConfigs,
        extensions: [[
          $class: 'RelativeTargetDirectory',
          relativeTargetDir: 'doseme-algorithms'
        ]] + [[$class: 'CleanCheckout']]
      ]
    )
  }

  if (util_revision) {
    stage("Checkout ${util_revision} of utils") {

      echo "Checking out ${util_revision} branch of doseme-util"

      checkout(
        [
           $class: 'GitSCM',
           branches: [[name: "${util_revision}"]],
           doGenerateSubmoduleConfigurations: false, // this repo does not have submodules
           userRemoteConfigs: [[
              credentialsId: "Github_Access_Token",
              url: 'https://github.com/doseme/doseme-util.git'
           ]],
           extensions: [[
              $class: 'RelativeTargetDirectory',
              relativeTargetDir: 'doseme-util'
           ]],
        ]
      )
    }
  }

  if (drugs_revision) {
    stage("Checkout ${drugs_revision} of drugs") {

      echo "Checking out ${drugs_revision} branch of doseme-drugs"

      checkout(
        [
           $class: 'GitSCM',
           branches: [[name: "${drugs_revision}"]],
           doGenerateSubmoduleConfigurations: false, // this repo does not have submodules
           userRemoteConfigs: [[
              credentialsId: "Github_Access_Token",
              url: 'https://github.com/doseme/doseme-drugs.git'
           ]],
           extensions: [[
              $class: 'RelativeTargetDirectory',
              relativeTargetDir: 'doseme-drugs'
           ]],
        ]
      )
    }
  }

  stage('Pull perlbase image') {
    def perlbase_image = docker.image('doseme/perlbase:latest')
    perlbase_image.pull()
  }

  def algorithms_image

  stage('Setup algorithms image') {
    algorithms_image = docker.build("doseme-algorithms", "-f doseme-algorithms/Dockerfile doseme-algorithms")
  }

  stage('Test algorithms image') {

    utils_mixin = '''echo 'Not mixing in specific utils version' &&'''
    if (util_revision) {
      utils_mixin =
        'cpanm --mirror=https://darkpan.doseme.io --mirror=https://cpan.metacpan.org/ --mirror-only -v --installdeps ./doseme-util &&' +
        '(HARNESS_OPTIONS=j8 cpanm -v --install ./doseme-util) &&'
    }

    drugs_mixin = '''echo 'Not mixing in specific drugs version' &&'''
    if (drugs_revision) {
      drugs_mixin =
        'cpanm --mirror=https://darkpan.doseme.io --mirror=https://cpan.metacpan.org/ --mirror-only -v --installdeps ./doseme-drugs &&' +
        '(HARNESS_OPTIONS=j8 cpanm -v --install ./doseme-drugs) &&'
    }

    try {
      algorithms_image.inside("-e HOME=/home/jenkins") {
        sh '''
          /bin/bash -c "
              eval '\$(perl -I\$HOME/perl5/lib/perl5 -Mlocal::lib)' &&
              cpanm --mirror=https://darkpan.doseme.io --mirror=https://cpan.metacpan.org/ --mirror-only -v --installdeps ./doseme-algorithms &&
           ''' + utils_mixin + drugs_mixin + '''
              cd doseme-algorithms &&
              dzil build --no-tgz &&
              cd DoseMe-Algorithms-* &&
              (AUTHOR_TESTING=1 prove -blv -j8 --formatter=TAP::Formatter::JUnit > ../../junit.xml || true) &&
              (perl -Ilib t/test-coverage.t > ../../test-coverage-report.txt || true) &&
              cd .. &&
              dzil clean
          "
        '''
      }
    } finally {
      junit 'junit.xml'
      archiveArtifacts artifacts: 'test-coverage-report.txt'
    }
  }
}
