#!/usr/bin/env bash

date_darwin="-Iseconds"
date_linux="--iso-8601=seconds"
release_files=$(grep -Rl "k8s_.*_release:" defaults/)
for file in $release_files; do
    ref_versions=$(grep --no-filename "k8s_.*_release:" "$file" | cut -d':' -f 1)
    for ref_version in $ref_versions; do
        # shellcheck disable=2001
        ref_base=$(echo "$ref_version" | sed -e "s/^\(k8s_[^_]*\)_.*/\1/")
        repo=$(yq ".${ref_base}_repo_name" <"${file}")
        org=$(yq ".${ref_base}_repo_org" <"${file}")
        if [[ "${repo}" != "null" && "${org}" != "null" ]]; then
            latest=$(curl -s "https://api.github.com/repos/${org}/${repo}/releases/latest" | jq '.tag_name' -r)
            tmp="$(mktemp)"
            # shellcheck disable=SC2016
            yq eval-all '. as $item ireduce ({}; . * $item)' \
                "${file}" \
                <(printf '%s: "%s"\n' "${ref_version}" "${latest}") \
                >"${tmp}"
            mv "${tmp}" "${file}"
        fi
    done
done

chart_files=$(grep -Rl "chart:" defaults/)
for file in ${chart_files}; do
    ref_versions=$(grep --no-filename "chart:" "${file}" | cut -d':' -f 1)
    for vardef in ${ref_versions}; do
        repo=$(yq ".${vardef}.repo" <"${file}")
        chart=$(yq ".${vardef}.name" <"${file}")
        if [[ -n "${repo}" && "${repo}" != "null" && -n "${chart}" && "${chart}" != "null" ]]; then
            tmp="$(mktemp)"
            if [[ "${OSTYPE}" == "linux-gnu"* ]]; then
                timestamp=$(date ${date_linux})
            elif [[ "${OSTYPE}" == "darwin"* ]]; then
                timestamp=$(date ${date_darwin})
            fi
            release=$(yq ".${vardef}.release" <"${file}")
            if [[ -n "${release}" && "${release}" != "null" ]]; then
              helm repo add "${chart}" "${repo}" >/dev/null 2>&1
              helm repo update >/dev/null 2>&1
              version=$(helm search repo "${chart}/${chart}" -o json | jq '.[0].version' -r)
              if [[ -n "${version}" && "${version}" != "null" ]]; then
                echo "Found version ${version} for chart ${chart}"
                yq eval-all '. as $item ireduce ({}; . * $item)' \
                    "${file}" \
                    <(printf '%s:\n  release: "%s"\n  last_checked: "%s"' "${vardef}" "${version}" "${timestamp}") \
                    >"${tmp}"
              else
                echo "Version query failed for chart ${chart} ... skipping"
                yq eval-all '. as $item ireduce ({}; . * $item)' \
                    "${file}" \
                    <(printf '%s:\n  last_checked: "%s"' "${vardef}" "${timestamp}") \
                    >"${tmp}"
              fi
            else
              echo "No release field set for chart ${chart} ... skipping"
              yq eval-all '. as $item ireduce ({}; . * $item)' \
                  "${file}" \
                  <(printf '%s:\n  last_checked: "%s"' "${vardef}" "${timestamp}") \
                  >"${tmp}"
            fi
            # shellcheck disable=SC2016
            mv "${tmp}" "${file}"
        fi
    done
done
