#!/usr/bin/env oo-ruby

require 'rubygems'
require 'json'

STDOUT.sync = true
STDERR.sync = true

@hostname = ENV['JENKINS_URL'].split("/")[-1]
@job_url = "/job/#{ENV['OPENSHIFT_APP_NAME']}-build"

def job_available?
  status_code = `curl -s -w %{http_code} --output /dev/null -X POST --insecure https://${JENKINS_USERNAME}:${JENKINS_PASSWORD}@#{@hostname}#{@job_url}/api/json`
  return status_code == '200'
end

def get_jobs_info
  jobs = `curl -s --insecure https://${JENKINS_USERNAME}:${JENKINS_PASSWORD}@#{@hostname}#{@job_url}/api/json`
  result = $?
  if result.exitstatus != 0
    puts "ERROR - Couldn't access jobs information"
    exit 290
  end
  JSON.parse(jobs.chomp)
end

def get_job_info(num)
  jobs = `curl -s --insecure https://${JENKINS_USERNAME}:${JENKINS_PASSWORD}@#{@hostname}#{@job_url}/#{num}/api/json`
  result = $?
  if result.exitstatus != 0
    puts "ERROR - Couldn't access job information"
    exit 291
  end
  JSON.parse(jobs.chomp)
end

def get_build_num
  jobs_info = get_jobs_info
  jobs_info["lastBuild"] ? jobs_info["lastBuild"]["number"].to_i : 0
end

def is_cancelled
  jobs_info = get_jobs_info
  queueItem = jobs_info["queueItem"]
end

def schedule_build
  status_code = `curl -s -w %{http_code} --output /dev/null -X POST --insecure https://${JENKINS_USERNAME}:${JENKINS_PASSWORD}@#{@hostname}#{@job_url}/build`
  if status_code != '302' && status_code != '200'
    puts "ERROR - Couldn't schedule job"
    exit 292
  end
end

if job_available?
  # Save the current build num
  build_num = get_build_num
  
  # Schedule a build
  schedule_build
  
  # Wait until a new build is kicked off
  next_build_num = get_build_num
  print "Waiting for build to schedule..."
  until next_build_num == build_num + 1
    print "."
    cancelled = is_cancelled
    if cancelled == nil
      next_build_num = get_build_num
      if next_build_num == build_num + 1
        break
      else
        puts ""
        puts "**BUILD FAILED/CANCELLED**"
        puts "Please see the Jenkins log for more details via 'rhc tail'"
        exit 1
      end
    end
    sleep 1
    next_build_num = get_build_num
  end
  puts "Done"
  
  # Block until a result shows up
  print "Waiting for job to complete..."
  json = get_job_info(next_build_num)
  until json["result"]
    print "."
    sleep 1
    json = get_job_info(next_build_num)
  end
  puts "Done"
  
  # Check the build result
  if json["result"] == "SUCCESS"
    puts "SUCCESS"
    exit 0
  else
    puts "FAILED"
    exit 1
  end
else
  puts "ERROR - Job not available: http://#{@hostname}#{@job_url}"
  exit 1
end
