#!/usr/bin/env bash
set -euo pipefail

usage() {
  cat <<'USAGE'
Usage:
  render_template.sh TEMPLATE --set key=value ... [-o output]
USAGE
}

if [[ $# -lt 1 ]]; then
  usage >&2
  exit 2
fi

template="$1"
shift
output=""
declare -A values

while [[ $# -gt 0 ]]; do
  case "$1" in
    --set)
      shift
      if [[ $# -eq 0 ]]; then
        echo "--set requires key=value" >&2
        exit 2
      fi
      if [[ "$1" != *=* ]]; then
        echo "Invalid --set value (expected key=value): $1" >&2
        exit 2
      fi
      key="${1%%=*}"
      val="${1#*=}"
      if [[ -z "$key" ]]; then
        echo "Invalid --set value (empty key): $1" >&2
        exit 2
      fi
      values["$key"]="$val"
      shift
      ;;
    -o|--output)
      shift
      if [[ $# -eq 0 ]]; then
        echo "-o/--output requires a path" >&2
        exit 2
      fi
      output="$1"
      shift
      ;;
    -h|--help)
      usage
      exit 0
      ;;
    *)
      echo "Unknown argument: $1" >&2
      usage >&2
      exit 2
      ;;
  esac
done

if [[ ${#values[@]} -eq 0 ]]; then
  echo "No values provided. Use a JSON file or --set key=value." >&2
  exit 2
fi

rendered="$(cat "$template")"
for key in "${!values[@]}"; do
  val="${values[$key]}"
  rendered="$(printf '%s' "$rendered" | sed -E "s/\{\{[[:space:]]*$key[[:space:]]*\}\}/$val/g")"
done

if [[ -n "$output" ]]; then
  printf '%s' "$rendered" > "$output"
else
  printf '%s' "$rendered"
fi
