
#!/bin/bash
# Bij aanroep via 'sh' automatisch herstart als 'bash' (POSIX-compatibel).
[ -z "$BASH_VERSION" ] && exec bash "$0" "$@"
# =============================================================================
# process_config.sh — Universele IaC-dispatcher: leest een RC file en stuurt
#                       Ansible aan op basis van SUBJECT + ACTION
#
# Gebruik:
#   ./scripts/process_config.sh [--rc configs/<naam>.rc] [--dry-run]
#
# Per ACTION (volledig via Ansible — geen Terraform):
#   create  → Ansible: DP-volume aanmaken + relatie definiëren + initialiseren
#   init    → Ansible: baseline transfer starten (relatie bestaat al)
#   status  → Ansible: status opvragen, geen wijzigingen
#   delete  → Ansible: relatie + DP-volume verwijderen
#
# Playbook: ansible/playbooks/snapvault-rc-dispatcher.yml
# =============================================================================

set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
BASE_DIR="$(cd "${SCRIPT_DIR}/.." && pwd)"

# --- Defaults ----------------------------------------------------------------
RC_FILE="${BASE_DIR}/configs/snapvault_config.rc"
DRY_RUN=false
ANSIBLE_DIR="${BASE_DIR}/ansible"

# --- Argumenten --------------------------------------------------------------
usage() {
  echo ""
  echo "Gebruik: bash $0 --rc configs/<naam>.rc [--dry-run]"
  echo ""
  echo "  --rc <pad>   RC file om te laden (verplicht)"
  echo "  --dry-run    Voer uit in check mode (geen wijzigingen)"
  echo "  -h|--help    Toon deze help"
  echo ""
  echo "Voorbeelden:"
  echo "  bash $0 --rc configs/snapvault_config.rc --dry-run"
  echo "  bash $0 --rc configs/snapvault_config.rc"
  echo ""
  echo "RC file variabelen:"
  echo "  SUBJECT=snapvault"
  echo "  ACTION=create|init|status|delete"
  echo "  TYPE=XDP"
  echo "  SOURCE_PATH=<svm>:<volume>"
  echo "  DESTINATION_PATH=<svm>:<volume>"
  echo ""
}

# Zonder argumenten: usage tonen en stoppen
if [[ $# -eq 0 ]]; then
  usage
  exit 0
fi

RC_FILE_SET=false
while [[ $# -gt 0 ]]; do
  case "$1" in
    --rc)       RC_FILE="$2"; RC_FILE_SET=true; shift 2 ;;
    --dry-run)  DRY_RUN=true; shift ;;
    -h|--help)  usage; exit 0 ;;
    *) echo "ERROR: Onbekend argument: $1"; echo ""; usage; exit 1 ;;
  esac
done

# --rc is verplicht
if ! ${RC_FILE_SET}; then
  echo "ERROR: --rc <pad> is verplicht"
  echo ""
  usage
  exit 1
fi

# --- RC file inlezen ---------------------------------------------------------
[[ -f "$RC_FILE" ]] || { echo "ERROR: RC file niet gevonden: ${RC_FILE}"; exit 1; }

# Laad KEY=VALUE regels; skip comments en lege regels
# IFS='=' + read zorgt dat waarden met '=' in de inhoud correct worden geladen
while IFS='=' read -r key value; do
  key="${key// /}"          # trim spaties uit sleutel
  value="${value// /}"      # trim spaties uit waarde
  [[ -z "$key" ]] && continue
  export "${key}=${value}"
done < <(grep -v '^\s*#' "$RC_FILE" | grep -v '^\s*$')

# Valideer verplichte variabelen
for var in SUBJECT ACTION TYPE SOURCE_PATH DESTINATION_PATH; do
  [[ -z "${!var:-}" ]] && { echo "ERROR: '${var}' ontbreekt in RC file: ${RC_FILE}"; exit 1; }
done

# --- Paden splitsen ----------------------------------------------------------
SOURCE_SVM="${SOURCE_PATH%%:*}"
SOURCE_VOL="${SOURCE_PATH##*:}"
DEST_SVM="${DESTINATION_PATH%%:*}"
DEST_VOL="${DESTINATION_PATH##*:}"

# --- SVM → cluster mapping ---------------------------------------------------
svm_to_cluster() {
  case "$1" in
    nlnafsmss02) echo "nlnaf102" ;;
    nlnafsmss03) echo "nlnaf103" ;;
    *) echo "" ;;
  esac
}

DEST_CLUSTER=$(svm_to_cluster "$DEST_SVM")
SOURCE_CLUSTER=$(svm_to_cluster "$SOURCE_SVM")

if [[ -z "$DEST_CLUSTER" ]]; then
  echo "ERROR: Geen cluster gevonden voor destination SVM '${DEST_SVM}'"
  echo "       Voeg de mapping toe aan de svm_to_cluster() functie in dit script."
  exit 1
fi

# --- Proxy-bypass voor interne ONTAP-clusters --------------------------------
_NO_PROXY_HOSTS="${DEST_CLUSTER},${SOURCE_CLUSTER:-},nlnaf100,nlnaf101,nlnaf102,nlnaf103,localhost,127.0.0.1,10.0.0.0/8,161.89.0.0/16"
export NO_PROXY="${_NO_PROXY_HOSTS}"
export no_proxy="${_NO_PROXY_HOSTS}"

# --- Samenvatting ------------------------------------------------------------
echo ""
echo "============================================================"
echo "  SnapVault Deploy Script"
echo "  RC file    : ${RC_FILE}"
echo "  Subject    : ${SUBJECT}"
echo "  Actie      : ${ACTION}"
echo "  Type       : ${TYPE}"
echo "  Source     : ${SOURCE_SVM}:${SOURCE_VOL}  (cluster: ${SOURCE_CLUSTER:-onbekend})"
echo "  Destination: ${DEST_SVM}:${DEST_VOL}  (cluster: ${DEST_CLUSTER})"
${DRY_RUN} && echo "  Modus      : DRY RUN (check mode — geen wijzigingen)"
echo "============================================================"
echo ""

# =============================================================================
# Routing op basis van SUBJECT → Ansible dispatcher
# =============================================================================

case "${SUBJECT,,}" in

  snapvault)
    case "${ACTION,,}" in
      create|init|status|delete) ;;
      *)
        echo "ERROR: Onbekende actie '${ACTION}'."
        echo "       Geldige waarden: create | init | status | delete"
        exit 1
        ;;
    esac

    ANSIBLE_EXTRA_VARS="action=${ACTION,,} source_svm=${SOURCE_SVM} source_vol=${SOURCE_VOL} dest_svm=${DEST_SVM} dest_vol=${DEST_VOL} dest_cluster=${DEST_CLUSTER} source_cluster=${SOURCE_CLUSTER:-}"

    ANSIBLE_OPTS=""
    ${DRY_RUN} && ANSIBLE_OPTS="--check"

    echo "▶  Ansible: snapvault-rc-dispatcher.yml (action=${ACTION,,})"
    echo ""

    cd "${ANSIBLE_DIR}" && ansible-playbook \
      -i inventory/production.yml \
      playbooks/snapvault-rc-dispatcher.yml \
      -e "${ANSIBLE_EXTRA_VARS}" \
      ${ANSIBLE_OPTS}
    ;;

  *)
    echo "ERROR: Onbekend subject '${SUBJECT}'"
    echo "       Geldige waarden: snapvault"
    exit 1
    ;;

esac

echo ""
echo "=== Klaar ==="

