#!/usr/bin/env bash

date_darwin="-Iseconds"
date_linux="--iso-8601=seconds"

# scan all files in argocd/ for chart definitions
for file in $(grep -Rl "chart:" argocd/); do
    repo=$(yq ".spec.repo" <"${file}" -r)
    chart=$(yq ".spec.chart" <"${file}" -r)
    if [[ -n "${repo}" && "${repo}" != "null" && -n "${chart}" && "${chart}" != "null" ]]; then
        if [[ "${OSTYPE}" == "linux-gnu"* ]]; then
            timestamp=$(date ${date_linux})
        elif [[ "${OSTYPE}" == "darwin"* ]]; then
            timestamp=$(date ${date_darwin})
        fi
        release=$(yq ".spec.version" <"${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}"
            tmp="$(mktemp)"
            yq eval-all '. as $item ireduce ({}; . * $item)' \
                "${file}" \
                <(printf 'spec:\n  version: "%s"' "${version}") \
                >"${tmp}"
            mv "${tmp}" "${file}"
          else
            echo "Version query failed for chart ${chart} ... skipping"
          fi
        else
          echo "No release field set for chart ${chart} ... skipping"
        fi
    fi
done

# scan all files in roles/components/defaults/main/ for chart definitions
for file in $(grep -Rl "chart:" roles/components/defaults/main/); do
    ref_versions=$(grep --no-filename "chart:" "${file}" | cut -d':' -f 1)
    for vardef in ${ref_versions}; do
        repo=$(yq ".${vardef}.repo" <"${file}" -r)
        chart=$(yq ".${vardef}.name" <"${file}" -r)
        if [[ -n "${repo}" && "${repo}" != "null" && -n "${chart}" && "${chart}" != "null" ]]; then
            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}"
                tmp="$(mktemp)"
                yq eval-all '. as $item ireduce ({}; . * $item)' \
                    "${file}" \
                    <(printf '%s:\n  release: "%s"' "${vardef}" "${version}" \
                    >"${tmp}"
                mv "${tmp}" "${file}"
              else
                echo "Version query failed for chart ${chart} ... skipping"
              fi
            else
              echo "No release field set for chart ${chart} ... skipping"
            fi
        fi
    done
done
