#!/usr/bin/env bash

set -eo pipefail

IFS=$'\n'
ENTRIES=$(yq -o=json '.multitemplate' ${IACD_DOCUMENT} | jq -c '.[]')

for entry in $ENTRIES; do
    entry_path=$(echo "${entry}" | jq -r '.path')
    entry_extension=$(echo "${entry}" | jq -r '.extension')
    entry_template="${IACD_PWD}/"$(echo "${entry}" | jq -r '.template')
    entry_config=$(echo "${entry}" | jq -r '.config')
    if [ -f "${entry_config}" ]; then
        entry_config_path="${entry_config}"
    else
        entry_config_path="${IACD_PWD}/${entry_config}"
    fi
    entry_mode=$(echo "${entry}" | jq -r '.mode')
    entry_ownership=$(echo "${entry}" | jq -r '.ownership')

    case ${1} in
        "create" | "update")
            rm -f "${entry_path}"/*."${entry_extension}"
            for template in $(yq -o=json '.items' "${entry_config_path}" | jq -cr '.[]'); do
                entry_name=$(echo "${template}" | jq -r '.name')
                echo "${template}" | tpl -f ${entry_template} > "${entry_path}/${entry_name}.${entry_extension}"
                chown "${entry_ownership}" "${entry_path}/${entry_name}.${entry_extension}"
                chmod "${entry_mode}" "${entry_path}/${entry_name}.${entry_extension}"
            done
            echo "Template ${entry_path} created (or updated)"
            ;;
        "delete")
            for template in $(yq -o=json '.items' "${entry_config_path}" | jq -cr '.[]'); do
                entry_name=$(echo "${template}" | jq -r '.name')
                rm -f "${entry_path}/${entry_name}.${entry_extension}"
            done
            echo "Template ${entry_path} deleted"
            ;;
        "compare")
            tmpfile=$(mktemp)
            for template in $(yq -o=json '.items' "${entry_config_path}" | jq -cr '.[]'); do
                entry_name=$(echo "${template}" | jq -r '.name')
                echo "${template}" | tpl -f ${entry_template} >> ${tmpfile}
            done
            tmpcontent=$(cat ${tmpfile} | sort | base64 -w 0)
            rm -f ${tmpfile}

            diff -q <(echo -n "${tmpcontent}") <(cat ${entry_path}/*.${entry_extension} | sort | base64 -w 0)
            ;;
    esac
done
