#!/usr/bin/env bash
# ---------------------------------------------------------------------------
# Copyright 2018-2024 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 WARRANTIESS OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ---------------------------------------------------------------------------
# chart_version_check.sh
# checks that changes to a chart include a change to the chart version
# ---------------------------------------------------------------------------

set -u
# set -euo pipefail

##-------------------##
##---]  GLOBALS  [---##
##-------------------##
declare -i -g force_fail=0
declare -a -g error_stream=()

# declare -A -g ARGV=() # ARGV['debug']=1
# declare -i -g debug=1 # uncomment to enable

## -----------------------------------------------------------------------
## Intent: Display a program banner for logging
## -----------------------------------------------------------------------
# shellcheck disable=SC2120
function banner()
{
    local program="${0##*/}"

    cat <<BANNER

# -----------------------------------------------------------------------
# Running: ${program} $@
# -----------------------------------------------------------------------
# Now: $(date '+%Y-%m-%d %H:%M:%S')
# Git: $(git --version)
# -----------------------------------------------------------------------
# COMPARISON_BRANCH: ${COMPARISON_BRANCH}
#         WORKSPACE: ${WORKSPACE}
# -----------------------------------------------------------------------
BANNER

    return
}

## -----------------------------------------------------------------------
## Intent: Display a log summary entry then exit with status.
## -----------------------------------------------------------------------
function summary_status_with_exit()
{
    local exit_code=$1; shift
    local program="${0##*/}"
    local summary=''
    [[ $# -gt 0 ]] && { summary=" - $1"; shift; }

    ## -----------------------------------
    ## status override courtesy of error()
    ## -----------------------------------
    declare -i -g force_fail
    if [ $force_fail -eq 1 ]; then exit_code=$force_fail; fi

    ## --------------------------
    ## Set summary display string
    ## --------------------------
    case "$exit_code" in
        0) status='PASS' ;;
        *) status='FAIL' ;;
    esac

    [[ $# -gt 0 ]] && formatStream "$@"

    echo
    echo "[$status] ${program} ${summary}"

    exit $exit_code
}

## -----------------------------------------------------------------------
## Intent: Display an error and configure report summary_status as FAIL
## -----------------------------------------------------------------------
function error()
{
    declare -i -g force_fail=1
    declare -a -g error_stream

    # shellcheck disable=SC2124
    local error="[ERROR] $@"
    error_stream+=("$error")
    echo "$error"
    return
}

## -----------------------------------------------------------------------
## Intent: Given a list (header and data) format contents as a log entry
## -----------------------------------------------------------------------
##  Usage: displayList --banner "List of something" "${data_stream[@]}"
## -----------------------------------------------------------------------
function displayList()
{
    local indent=''
    while [ $# -gt 0 ]; do
        local arg="$1"
        case "$arg" in
            -*banner)  shift; echo "$1"     ;;
            -*indent)  shift; indent="$1"   ;;
            -*tab-2)   echo -n '  '         ;;
            -*tab-4)   echo -n '    '       ;;
            -*tab-6)   echo -n '      '     ;;
            -*tab-8)   echo -n '        '   ;;
            -*newline) echo;                ;;
            -*tab)     echo -n '    '       ;;
            *) break                        ;;
        esac
        shift
    done

    for line in "$@";
    do
        echo -e "  ${indent}$line"
    done
    return
}

## -----------------------------------------------------------------------
## Intent: Program init, provide defaults for globals, etc.
## -----------------------------------------------------------------------
function init()
{
    # when not running under Jenkins, use current dir as workspace
    #   o [TODO] - Perform a secondary username check to guard against a
    #     jenkins/bash env hiccup leaving WORKSPACE= temporarily undefined.
    WORKSPACE=${WORKSPACE:-.}
    COMPARISON_BRANCH="${COMPARISON_BRANCH:-opencord/master}"
    return
}

## -----------------------------------------------------------------------
## Intent: Remove quotes, whitespace & garbage from a string
## -----------------------------------------------------------------------
## ..seealso: https://www.regular-expressions.info/posixbrackets.html
## -----------------------------------------------------------------------
function filter_codes()
{
    declare -n val="$1"; shift             # indirect
    val="${val//[\"\'[:blank:][:cntrl:]]}" # [:punct:] contains hyphen
    return
}

## -----------------------------------------------------------------------
## Intent: Detect and report VERSION file changes
## -----------------------------------------------------------------------
## :param path: Path to a Chart.yaml file.
## :type  path: str
##
## :param branch: Comparsion baranch (?-remote-?)
## :type  branch: str
##
## :return: true if embedded version string was modified.
## :rtype:  int
## -----------------------------------------------------------------------
## ..note: What about change detection for: apiVersion, appVersion (?)
## -----------------------------------------------------------------------
function version_diff()
{
    local path="$1";         shift
    local branch="$1";       shift

    declare -n old_var="$1"; shift # indirect
    declare -n new_var="$1"; shift # indirect

    old_var=''
    new_var=''
    readarray -t delta < <(git diff -p "$branch" -- "$path")

    local modified=0
    if [ ${#delta[@]} -gt 0 ]; then # modified

        #----------------------------------------
        # diff --git a/voltha-adapter-openolt/Chart.yaml [...]
        # --- a/voltha-adapter-openolt/Chart.yaml
        # +++ b/voltha-adapter-openolt/Chart.yaml
        # @@ -14,7 +14,7 @@
        # ---
        # -version: "2.11.3"   (====> 2.11.3)
        # +version: "2.11.8"   (====> 2.11.8)
        #----------------------------------------
        local line
        for line in "${delta[@]}";
        do
            # [TODO] Replace awk with string builtins to reduce shell overhead.
            case "$line" in
                -version:*)
                    modified=1
                    readarray -t tmp < <(awk '/^\-version:/ { print $2 }' <<<"$line")
                    # shellcheck disable=SC2034
                    old_var="${tmp[0]}"
                    filter_codes 'old_var'
                    ;;
                +version:*)
                    readarray -t tmp < <(awk '/^\+version:/ { print $2 }' <<<"$line")
                    # shellcheck disable=SC2034
                    new_var="${tmp[0]}"
                    filter_codes 'new_var'
                    ;;
            esac
        done
    fi

    [ $modified -ne 0 ] # set $? for if/then/elif use: "if version_diff; then"
    return
}

## -----------------------------------------------------------------------
## Intent: Gather a list of Chart.yaml files from the workspace.
## -----------------------------------------------------------------------
function gather_charts()
{
    declare -n varname="$1"; shift
    readarray -t varname < <(find . -name 'Chart.yaml' -print)

    local idx
    for (( idx=0; idx<${#varname[@]}; idx++ ));
    do
        local val="${varname[idx]}"
        if [ ${#val} -lt 2 ]; then continue; fi

        # Normalize: remove './' to support path comparison
        if [[ "${val:0:2}" == './' ]]; then
            varname[idx]="${val:2:${#val}}"
            [[ -v debug ]] && echo "[$idx] ${varname[$idx]}"
        fi
    done

    [[ -v debug ]] && declare -p varname
    return
}

## -----------------------------------------------------------------------
## Intent: Given a chart file and complete list of modified files
##   display a list of files modified in the chart directory.
## -----------------------------------------------------------------------
## :param chart: path to a Chart.yaml file
## :type  chart: str
##
## :param varname: A list files modified in a git sandbox.
## :type  varname: list, indirect
## -----------------------------------------------------------------------
function report_modified()
{
    local chart="$1"; shift
    local dir="${chart%/*}"
    # shellcheck disable=SC2178
    declare -n varname="$1"; shift

    ## ---------------------------------------------
    ## Gather files contained in the chart directory
    ## ---------------------------------------------
    declare -a found=()
    for val in "${varname[@]}";
    do
        case "$val" in
            */Chart.yaml) ;; # special case
            "${dir}"*) found+=("$val") ;;
        esac
    done

    ## --------------------------------------------
    ## Display results when modified files detected
    ## --------------------------------------------
    if [ ${#found[@]} -gt 0 ]; then
        declare -a stream=()
        stream+=('--tab-4')
        stream+=('--banner' "Files Changed: $dir")
        stream+=('--tab-6') # really --tab-8
        stream+=("${found[@]}")
        displayList "${stream[@]}"
    fi

    [ ${#found[@]} -gt 0 ] # set $? for if/else
    return
}

## -----------------------------------------------------------------------
## Intent: Gather a list of Chart.yaml files from the workspace.
## -----------------------------------------------------------------------
declare -a -g charts=()
declare -a -g changes_remote=()
declare -a -g untracked_files=()
function gather_state()
{
    local branch="$1"; shift

    gather_charts 'charts'
    [[ -v debug ]] && declare -p charts

    readarray -t changes_remote < <(git diff --name-only "$branch")
    [[ -v debug ]] && declare -p changes_remote

    readarray -t untracked_files < <(git ls-files -o --exclude-standard)
    [[ -v debug ]] && declare -p untracked_files

    return
}

# shellcheck disable=SC1073
##----------------##
##---]  MAIN  [---##
##----------------##
init
# shellcheck disable=SC2119
banner
gather_state "$COMPARISON_BRANCH"

chart=''
for chart in "${charts[@]}";
do
    [[ -v debug ]] && echo -e "\nCHART: $chart"

    chart_dir="${chart%/*}"

    ## ---------------------------
    ## Detect VERSION file changes
    ## ---------------------------
    declare -i chart_modified=0
    old=''
    new=''
    if version_diff "$chart" "$COMPARISON_BRANCH" 'old' 'new'; then
        suffix="($old => $new)" # display verion deltas in the right margin
        printf '[CHART] %-60s %s\n' "$chart" "$suffix"
        chart_modified=1
    else
        suffix="($old)"
        printf '[CHART] %s\n' "$chart"
    fi

    ## -----------------------------------
    ## Report modified files for the chart
    ## -----------------------------------
    declare -a combo_list=()
    combo_list+=("${changes_remote[@]}")
    combo_list+=("${untracked_files[@]}")
    if report_modified "$chart" 'combo_list';
    then
        if [ $chart_modified -eq 0 ]; then
            error "Chart modified but version unchanged: ${chart_dir}"
        fi
    fi

done

## ---------------------------
## Report summary: local edits
## ---------------------------
if [[ -x changes_remote ]] && [ ${#changes_remote} -gt 0 ]; then # local_edits
    displayList \
        '--newline'                 \
        '--banner' 'Changed Files:' \
        "${changes_remote[@]}"
fi

## -------------------------------
## Report summary: untracked files
## -------------------------------
if [ ${#untracked_files[@]} -gt 0 ]; then
    displayList \
        '--newline'                   \
        '--banner' 'Untracked Files:' \
        "${untracked_files[@]}"
fi

## ---------------------------------
## Report summary: problems detected
## ---------------------------------
declare -a -g error_stream
if [ ${#error_stream[@]} -gt 0 ]; then
    displayList \
        '--newline'                 \
        '--banner' 'Error Sumamry:' \
        "${error_stream[@]}"
fi

summary_status_with_exit $?

# -----------------------------------------------------------------------
# Running: chart_version_check.sh
# -----------------------------------------------------------------------
# Now: 2022-12-09 03:10:52
# Git: git version 2.34.1
# -----------------------------------------------------------------------
# COMPARISON_BRANCH: origin/master
#         WORKSPACE: .
# -----------------------------------------------------------------------
# [CHART] voltha-adapter-openolt/Chart.yaml                            (2.11.3 => 2.11.8)
# [CHART] voltha-tracing/Chart.yaml
# [CHART] voltha/Chart.yaml
#    Files Changed: voltha-tracing
#        voltha-tracing/values.yaml
# [ERROR] Chart modified but version unchanged: voltha-tracing
# [CHART] voltha/Chart.yaml
# -----------------------------------------------------------------------

# [SEE ALSO
# ---------------------------------------------------------------------------
# https://www.regular-expressions.info/posixbrackets.html (character classes)
# ---------------------------------------------------------------------------
