#!/usr/bin/env bash

set -u -o pipefail

if ! [[ "$0" =~ scripts/generate_release_notes.sh ]]; then
	echo "must be run from repository root"
	exit 1
fi

if [[ $# -ne 1 ]]; then
	echo "usage: scripts/generate_release_notes.sh <version>"
	echo "examples:"
	echo "  scripts/generate_release_notes.sh 3.11.0"
	echo "  scripts/generate_release_notes.sh 3.11.0-rc.0"
	echo "  scripts/generate_release_notes.sh 3.11.0-rc.1"
	echo "  scripts/generate_release_notes.sh 3.11.1"
	exit 1
fi

version="${1#v}"
IFS='.' read -r major minor patch_rest <<< "${version}"
# Strip any pre-release suffix (e.g. "0-rc.0" -> "0").
patch="${patch_rest%%-*}"

if [[ -z "${GITHUB_TOKEN:-}" ]]; then
	echo "GITHUB_TOKEN is not set"
	exit 1
fi
if ! command -v release-notes >/dev/null 2>&1; then
	echo "release-notes not found. Install: go install k8s.io/release/cmd/release-notes@v0.20.1"
	exit 1
fi

TMPL='{{- $version := .CurrentRevision -}}
{{- if not $version}}{{- $version = "X.Y.Z" -}}{{end -}}
## {{$version}} / YYYY-MM-DD
{{/* Sort the sections */}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 10) "[SECURITY]"}}- {{$note}}
{{end}}{{end}}{{end -}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 8) "[CHANGE]"}}- {{$note}}
{{end}}{{end}}{{end -}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 9) "[FEATURE]"}}- {{$note}}
{{end}}{{end}}{{end -}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 13) "[ENHANCEMENT]"}}- {{$note}}
{{end}}{{end}}{{end -}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 6) "[PERF]"}}- {{$note}}
{{end}}{{end}}{{end -}}
{{- range .Notes}}{{range $note := .NoteEntries}}{{if eq (slice $note 0 8) "[BUGFIX]"}}- {{$note}}
{{end}}{{end}}{{end}}
.'

release_branch="release-${major}.${minor}"

tmp_file=$(mktemp)
trap 'rm -f "${tmp_file}"' EXIT

if [[ "${patch}" == "0" ]]; then
	# Minor release (any RC or final): cover the full cycle from the previous minor's branch-cut point.
	prev_minor=$(( minor - 1 ))
	start_sha="$(git log -1 --format='%P' "v${major}.${prev_minor}.0-rc.0" | awk '{print $1}')"
	end_rev="${release_branch}"
	echo "Generating release notes for version=${version} major=${major} minor=${minor} patch=${patch} start_sha=${start_sha} end_rev=${end_rev}"
	release-notes generate \
		--start-sha="${start_sha}" \
		--end-rev="${end_rev}" \
		--branch="${release_branch}" \
		--org prometheus --repo prometheus \
		--required-author="" --dependencies=false \
		--go-template="go-template:inline:${TMPL}" \
		--output="${tmp_file}" || exit 1
else
	# Patch release: cover commits since the previous patch tag.
	prev_patch=$(( patch - 1 ))
	start_rev="v${major}.${minor}.${prev_patch}"
	end_rev="${release_branch}"
	echo "Generating release notes for version=${version} major=${major} minor=${minor} patch=${patch} start_rev=${start_rev} end_rev=${end_rev}"
	release-notes generate \
		--start-rev="${start_rev}" \
		--end-rev="${end_rev}" \
		--branch="${release_branch}" \
		--org prometheus --repo prometheus \
		--required-author="" --dependencies=false \
		--go-template="go-template:inline:${TMPL}" \
		--skip-first-commit \
		--output="${tmp_file}" || exit 1
fi

# sed is used to remove the @user references from the release notes.
# Prometheus CHANGELOG used to not do this.
sed -E 's/\((#[0-9]+), @[^)]+\)/\1/g' "${tmp_file}"

echo "Done; Removing "${tmp_file}" temporary file."
echo "Maintainers, please copy the output to CHANGELOG.md and adjust if needed."
