#!/usr/bin/env ruby
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# Updates the CHANGELOG for the specified Apache Aurora release, if no
# version override is specified then .auroraversion will be read and used.
# The version string will need to match the Apache Aurora jira tickets
# fixVersion to generate this list.
#
require 'rubygems'
require 'json'
require 'uri'
require 'net/http'
require 'net/https'
require 'openssl'
require 'tempfile'

def http_post(uri, params={}, headers={}, body=nil, debug=false)
  http = Net::HTTP.new(uri.host, uri.port)
  http.set_debug_output($stdout) if debug
  if uri.scheme == "https" || uri.port == 443
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  end
  response = nil

  begin
    request = Net::HTTP::Post.new(uri.request_uri)
    request.set_form_data(params) if (params && params.size > 1)
    request.basic_auth uri.user, uri.password if uri.user
    request.body = body if body

    headers.each_pair do |name, value|
      request[name] = value
    end

    response = http.request(request)
  rescue Exception => e
    raise "Error posting to #{uri.to_s}. #{e}"
  end

  response
end

def get_jira_issues_for_query(url, jql, startAt=0, maxResults=100)
  begin
    request_body = { :jql => jql, :startAt => startAt, :maxResults => maxResults}
    response = http_post(
      URI(url),
      {},
      {"content-type" => 'application/json', "accept" => "application/json"},
      request_body.to_json
    )
  rescue StandardError => e
    raise "Error executing jql query: #{jql}. #{e}"
  end

  begin
    results = JSON.parse(response.body)
  rescue StandardError => e
    raise "Error parsing json result"
  end

  results
end

def get_all_jira_issues_for_query(url, jql)
  startAt = 0
  maxResults = 100

  results = []
  begin
    res = get_jira_issues_for_query(url, jql, startAt, maxResults)
    results.concat(res['issues']) if res && res.has_key?('issues')
    startAt = startAt + maxResults
  end until (results.size() == res['total'] )

  results
end

base_dir = `git rev-parse --show-toplevel`.strip

# Get the current version from the .auroraversion file if no version override is provided
version = nil
if ARGV[0].nil?
  version = nil
  Dir.chdir(base_dir) do
    version = File.read('.auroraversion').strip
  end
else
  version = ARGV[0]
end

raise "Unable to read .auroraversion" if version.nil?

jira_base_url = "https://issues.apache.org/jira"
jira_search_url = "/rest/api/2/search"
jira_url = jira_base_url + jira_search_url

jql="project=AURORA " \
    "AND fixVersion='#{version}' " \
    "AND status = Resolved " \
    "AND resolution in (Fixed, Done) " \
    "ORDER BY issuetype DESC"

# Fetch all the issues available for the given jql query
results = get_all_jira_issues_for_query(jira_url, jql)

changelog = {}
# Loop through and add all results
results.each do |issue|
  key = issue['key']
  summary = issue['fields']['summary']
  type = issue['fields']['issuetype']['name']

  changelog_entry = "[#{key}] - #{summary}"

  if !changelog[type].nil?
    changelog[type] << changelog_entry
  else
    changelog[type] = [changelog_entry]
  end
end

# Merge the new updates and the existing changelog
tmpfile = Tempfile.open('aurora.changelog')
begin
  tmpfile.puts "Aurora #{version}", "-" * 80
  changelog.keys.sort.each do |type|
    tmpfile.puts "## #{type}"
    changelog[type].each { |entry| tmpfile.puts "    * #{entry}" }
    tmpfile.puts ""
  end
  # Append all the existing CHANGELOG entries and write the new CHANGELOG file
  tmpfile.puts ""
  changelog_file = File.join(base_dir, 'CHANGELOG')
  tmpfile.write File.read(changelog_file) if File.exist?(changelog_file)
  tmpfile.rewind
  tmpfile.flush
  File.open(changelog_file,"w+") {|f|  f.write(tmpfile.read) }
ensure
  tmpfile.close
  tmpfile.unlink
end
