#!/usr/bin/env bash

# Copyright 2018-2023 Open Networking Foundation (ONF) and the ONF Contributors
#
# 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.

# helmrepo.sh
# creates or updates a helm repo for publishing on the guide website
# Reference: https://github.com/helm/charts/blob/master/test/repo-sync.sh

set -eu -o pipefail

##-------------------##
##---]  GLOBALS  [---##
##-------------------##

# when not running under Jenkins, use current dir as workspace
WORKSPACE=${WORKSPACE:-.}

# directory to compare against, doesn't need to be present
OLD_REPO_DIR="${OLD_REPO_DIR:-cord-charts-repo}"
NEW_REPO_DIR="${NEW_REPO_DIR:-chart_repo}"

PUBLISH_URL="${PUBLISH_URL:-charts.opencord.org}"

## -----------------------------------------------------------------------
## Intent: Dispay called function with given output
## -----------------------------------------------------------------------
function func_echo()
{
    echo "** ${FUNCNAME[1]}: $*"
    return
}

## -----------------------------------------------------------------------
## Intent: Display given text and exit with shell error status.
## -----------------------------------------------------------------------
function error()
{
    echo -e "** ${BASH_SOURCE[0]##*/}::${FUNCNAME[1]} ERROR: $*"
    exit 1
}

## -----------------------------------------------------------------------
## Intent: Detect pre-existing versioned packages.
## -----------------------------------------------------------------------
function check_packages()
{
    local dir="$1"; shift

    readarray -t package_paths < <(find "${dir}" -name '*.tgz' -print)
    declare -p package_paths

    # ---------------------------------------------
    # Check for versioned package collision.
    # ---------------------------------------------
    for package_path in "${package_paths[@]}";
    do
	package="${package_path##*/}" # basename
	
	if [ -f "${OLD_REPO_DIR}/${package}" ]; then
	    echo
	    echo "PACKAGE: $package"
	    /bin/ls -l "$package_path"
	    /bin/ls -l "${OLD_REPO_DIR}/${package}"
	    error "Package: ${package} with same version already exists in ${OLD_REPO_DIR}"
	fi
    done

    return
}

## -----------------------------------------------------------------------
## Intent: Gather a list of Chart.yaml files from the filesystem.
## -----------------------------------------------------------------------
function get_chart_yaml()
{
    local dir="$1"    ; shift
    declare -n ref=$1 ; shift

    readarray -t _charts < <(find "$dir" -name Chart.yaml -print | sort)
    ref=("${_charts[@]}")
    return
}

## -----------------------------------------------------------------------
## Intent: Given a helm chart line extract and return *version.
## -----------------------------------------------------------------------
function getVersion()
{
    # shellcheck disable=SC2178
    local -n ref=$1; shift # declare -A
    local line="$1"; shift

    [[ -v debug ]] && func_echo "LINE: $line"

    # foo=${string#"$prefix"}

    line="${line%\#*}"            # Snip comments
    line="${line//[[:blank:]]}"   # Prune whitespace

    # version : x.y.z
    readarray -d':' -t _fields < <(printf '%s' "$line")

    local key="${_fields[0]}"
    local val="${_fields[1]}"
    ref[$key]="$val"

    return
}

## -----------------------------------------------------------------------
## Intent: Update helm package dependencies
## -----------------------------------------------------------------------
function helm_deps_update()
{
    local dest="$1"; shift    # helm --destination

    if [[ -v dry_run ]]; then
	func_echo "helm package --dependency-update --destination $dest $chartdir"
    else
	helm package --dependency-update --destination "$dest" "$chartdir"
    fi
    return
}

## -----------------------------------------------------------------------
## Intent: Update helm package index
## -----------------------------------------------------------------------
function helm_index_publish()
{
    local repo_dir="$1"; shift    # helm --destination

    if [[ -v dry_run ]]; then
	func_echo "helm repo index $repo_dir --url https://${PUBLISH_URL}"

    elif [[ -v no_publish ]]; then
	func_echo "[SKIP] helm publishing due to --no-publish"
	
    else
	## ------------------------------------------------
	## Helm updates are guarded by jenkins
	## Revision control should reinforce that assertion
	## ------------------------------------------------
	case "$USER" in
	    jenkins)
		helm repo index "$repo_dir" --url https://"${PUBLISH_URL}"
		;;
	    *)
		func_echo "[SKIP] helm publishing due to ($USER != jenkins)"
		;;
	esac
    fi

    return
}

## -----------------------------------------------------------------------
## Intent: Update helm package index
## -----------------------------------------------------------------------
function helm_index_merge()
{
    local old_repo="$1" ; shift
    local new_repo="$1" ; shift

    declare -a cmd=()
    cmd+=('helm' 'repo' 'index')
    cmd+=('--url' "https://${PUBLISH_URL}")
    cmd+=('--merge' "${old_repo}/index.yaml" "$new_repo")

    if [[ -v dry_run ]]; then
	func_echo "${cmd[@]}"
    else
	"${cmd[@]}"
    fi
    return
}

## -----------------------------------------------------------------------
## Intent: Given a Chart.yaml file path return test directory where stored
## -----------------------------------------------------------------------
function chart_path_to_test_dir()
{
    local val="$1"    ; shift

# shellcheck disable=SC2178
   declare -n ref=$1 ; shift # indirect var

    val="${val%/Chart.yaml}"  # dirname: prune /Chart.yaml
    val="${val##*/}"          # basename: test directory

# shellcheck disable=SC2034,SC2178
    ref="$val"                # Return value to caller
    return
}

## -----------------------------------------------------------------------
## Intent: Given Chart.yaml files create a new indexed chart repository
## -----------------------------------------------------------------------
function create_helm_repo_new()
{
    local repo_dir="$1"; shift # NEW_REPO_DIR
    local work_dir="$1"; shift # WORKSPACE

    echo "Creating new helm repo: ${repo_dir}"

    declare -a charts=()
    get_chart_yaml "$work_dir" charts

    local chart
    for chart in "${charts[@]}";
    do
	echo
	func_echo "Chart.yaml: $chart"

	chartdir=''
	chart_path_to_test_dir "$chart" chartdir
	func_echo " Chart.dir: $chartdir"

	helm_deps_update "${repo_dir}"
    done

    helm_index_publish "${repo_dir}"

    return
}

## -----------------------------------------------------------------------
## Intent: Compare version stings extracted from Chart.yaml delta.
##   o attribute version:x.y.z must be changed to enable change
##     detection and chart loading.
## -----------------------------------------------------------------------
function validate_changes()
{
    local chart="$1"; shift 
    # shellcheck disable=SC2178
    local -n ref=$1; shift

    local msg
    ## -------------------------------------------
    ## Validation logic: all keys collected exist
    ## Chart version must change to enable loading
    ## -------------------------------------------
    local key0
    for key0 in "${!ref[@]}";
    do
	local key="${key0:1}"
	# shellcheck disable=SC2034
	local old="-${key}"
	local new="+${key}"

	## Key/val paris are diff deltas:
	##   -version : 1.2.3
	##   +version : 4.5.6
	if [[ ! -v ref['-version'] ]]; then
	    msg='Modify version= to publish chart changes'
	elif [[ ! -v ref["$new"] ]]; then
	    msg="Failed to detect +${key}= change in attributes"
	else
	    continue
	fi

	local -i failed=1
	cat <<ERR

** -----------------------------------------------------------------------
** Chart dir: $chartdir
** Chart.yml: $chart
**     Error: $msg
** -----------------------------------------------------------------------
ERR
	func_echo "$(declare -p versions | sed -e 's/\[/\n\[/g')"
    done

    if [[ -v failed ]]; then
	false
    else
	true
    fi

    return
}

##----------------##
##---]  MAIN  [---##
##----------------##

while [ $# -gt 0 ]; do
    arg="$1"; shift

    case "$arg" in
	-*debug)      declare -g -i debug=1      ;;
	-*dry*)       declare -g -i dry_run=1    ;;
	-*no-publish) declare -g -i no_publish=1 ;;
	-*help)
	    cat <<EOH
Usage: $0
  --debug       Enable debug mode
  --dry-run     Simulate helm calls
EOH
	    ;;

	-*) echo "[SKIP] unknown switch [$arg]" ;;
	*) echo "[SKIP] unknown argument [$arg]" ;;
    esac
done


echo "# helmrepo.sh, using helm: $(helm version -c) #"

# create and clean NEW_REPO_DIR
mkdir -p "${NEW_REPO_DIR}"
rm -f "${NEW_REPO_DIR}"/*

# if OLD_REPO_DIR doesn't exist, generate packages and index in NEW_REPO_DIR
if [ ! -d "${OLD_REPO_DIR}" ]
then
    create_helm_repo_new "$NEW_REPO_DIR" "$WORKSPACE"
    echo
    echo "# helmrepo.sh Success! Generated new repo index in ${NEW_REPO_DIR}"

else
  # OLD_REPO_DIR exists, check for new charts and update only with changes
  echo "Found existing helm repo: ${OLD_REPO_DIR}, attempting update"

  # Loop and create chart packages, only if changed
  declare -a charts=()
  get_chart_yaml "$WORKSPACE" charts

  for chart in "${charts[@]}";
  do
      echo
      func_echo "Chart.yaml: $chart"

      chartdir=''
      chart_path_to_test_dir "$chart" chartdir
      func_echo " Chart.dir: $chartdir"

      # See if chart version changed from previous HEAD commit
      readarray -t chart_yaml_diff < <(git diff -p HEAD^ -- "$chart")

      if [[ ! -v chart_yaml_diff ]]; then
	  echo "Chart unchanged, not packaging: '${chartdir}'"

      # -------------------------------------------------------------------
      # Assumes that helmlint.sh and chart_version_check.sh have been run
      # pre-merge, which ensures that all charts are valid and have their
      # version updated in Chart.yaml
      # -------------------------------------------------------------------
      elif [ ${#chart_yaml_diff} -gt 0 ]; then
	  declare -A versions=()
	  for line in "${chart_yaml_diff[@]}";
	  do
	      [[ -v debug ]] && func_echo "$line"

	      case "$line" in
		  # appVersion: "1.0.3"
		  # version: 1.2.3
		  [-+]*[vV]ersion:*) getVersion versions "$line" ;;
	      esac
	  done

	  # ---------------------------------------------------------------
	  # [TODO] -- versions['-version']='version string change required'
	  # ---------------------------------------------------------------
	  # version: string change initiates a delta forcing helm to update.
	  # Should it be required by every checkin ?  For ex: release may
	  # accumulate several version edits then publish all when finished.
	  #
	  # Danger would be chart changes are not published/tested when
	  # a dev forgets to update the chart version string.
	  # ---------------------------------------------------------------

	  ## ---------------------------------------------------------------
	  ## Check for required version change and stray attribute deletions
	  ## We are comparing diff output [-+]verison : x.y
	  ## +{key} indicates a required attribute exists and was modified
	  ## ---------------------------------------------------------------
	  if ! validate_changes "$chart" versions; then
	      declare -g -i failed=1
	      continue
          fi

	  # Always query, version string may not have changed
	  readarray -t ver < <(grep -oP '(?<= version: )\S+' "$chart")
	  declare -p ver

	  echo "Detected new version of chart ${chartdir}, creating package: ${ver[*]}"

	  helm_deps_update "${NEW_REPO_DIR}"

      else
	  echo "Chart unchanged, not packaging: '${chartdir}'"
      fi
  done

  check_packages "$NEW_REPO_DIR"

  ## -----------------------------------------------------------------------
  ## -----------------------------------------------------------------------
  # only update index when new charts are added
  if [ ${#package_paths[@]} -gt 0 ]; then

      # Create updated index.yaml (new version created in NEW_REPO_DIR)
      helm_index_merge "${OLD_REPO_DIR}" "${NEW_REPO_DIR}"

      # move over packages and index.yaml
      mv "${NEW_REPO_DIR}"/*.tgz "${OLD_REPO_DIR}/"
      mv "${NEW_REPO_DIR}/index.yaml" "${OLD_REPO_DIR}/index.yaml"

      echo "# helmrepo.sh Success! Updated existing repo index in ${OLD_REPO_DIR}"

  else
    echo "# helmrepo.sh Success! No new charts added."
  fi
fi

exit 0

# [EOF]
