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

# Konfiguration (anpassen falls nötig)
NAMESPACE="nextcloud"
RELEASE="nextcloud"
CHART="nextcloud/nextcloud"
VALUES_FILE="values-nextcloud.yaml"
SMB_SCRIPT_FILE="install-smb.sh"
CONFIGMAP_NAME="smb-install-script"
HELM_REPO_NAME="nextcloud"
HELM_REPO_URL="https://nextcloud.github.io/helm/"
WAIT_TIMEOUT="600s"   # Timeout für Pod-Readiness (10m)

# Hilfsfunktionen
err() { echo "ERROR: $*" >&2; exit 1; }
info() { echo "INFO: $*"; }

confirm() {
  echo
  echo "!!! Achtung: Das Skript wird das Helm-Release '$RELEASE' im Namespace '$NAMESPACE' deinstallieren"
  echo "    und alle zugehörigen PersistentVolumeClaims (PVCs) löschen. Daten gehen verloren!"
  echo
  read -p "Tippe DELETE um fortzufahren (oder STRG-C zum Abbrechen): " ans
  if [ "$ans" != "DELETE" ]; then
    echo "Abgebrochen."
    exit 0
  fi
}

check_tools() {
  command -v kubectl >/dev/null 2>&1 || err "kubectl ist nicht installiert oder nicht in PATH"
  command -v helm >/dev/null 2>&1 || err "helm ist nicht installiert oder nicht in PATH"
}

create_namespace_if_missing() {
  if ! kubectl get namespace "$NAMESPACE" >/dev/null 2>&1; then
    info "Namespace $NAMESPACE existiert nicht — wird angelegt"
    kubectl create namespace "$NAMESPACE"
  else
    info "Namespace $NAMESPACE existiert"
  fi
}

uninstall_release() {
  if helm -n "$NAMESPACE" status "$RELEASE" >/dev/null 2>&1; then
    info "Helm-Release '$RELEASE' gefunden -> deinstalliere..."
    helm -n "$NAMESPACE" uninstall "$RELEASE"
    info "Warte bis alle Pods des Releases entfernt sind..."
    # Warte bis keine Pods mehr mit dem Release-Label vorhanden sind
    for i in $(seq 1 60); do
      sleep 2
      COUNT=$(kubectl -n "$NAMESPACE" get pods -l app.kubernetes.io/instance="$RELEASE" --no-headers 2>/dev/null | wc -l || true)
      if [ "$COUNT" -eq 0 ]; then
        break
      fi
      echo -n "."
    done
    echo
  else
    info "Kein bestehendes Helm-Release '$RELEASE' gefunden"
  fi
}

delete_pvcs() {
  # Liste PVCs, die zum Release gehören (Label app.kubernetes.io/instance)
  PVCS=$(kubectl -n "$NAMESPACE" get pvc -l app.kubernetes.io/instance="$RELEASE" -o jsonpath='{.items[*].metadata.name}' || true)
  if [ -z "$PVCS" ]; then
    info "Keine PVCs mit Label app.kubernetes.io/instance=$RELEASE gefunden"
    return
  fi

  info "Folgende PVCs werden gelöscht: $PVCS"
  kubectl -n "$NAMESPACE" delete pvc $PVCS
  info "Warte auf Löschung der PVCs..."
  for pvc in $PVCS; do
    kubectl -n "$NAMESPACE" wait --for=delete pvc/"$pvc" --timeout=120s || true
  done
}

recreate_configmap() {
  if [ ! -f "$SMB_SCRIPT_FILE" ]; then
    err "SMB-Script '$SMB_SCRIPT_FILE' fehlt. Lege die Datei an oder passe \$SMB_SCRIPT_FILE an."
  fi
  info "Erstelle/aktualisiere ConfigMap $CONFIGMAP_NAME aus $SMB_SCRIPT_FILE"
  kubectl -n "$NAMESPACE" create configmap "$CONFIGMAP_NAME" --from-file="$SMB_SCRIPT_FILE" -o yaml --dry-run=client | kubectl apply -f -
}

add_helm_repo() {
  # Add repo if not exists
  if ! helm repo list | awk '{print $1}' | grep -xq "$HELM_REPO_NAME"; then
    info "Füge Helm-Repo $HELM_REPO_NAME hinzu"
    helm repo add "$HELM_REPO_NAME" "$HELM_REPO_URL"
  fi
  helm repo update
}

install_release() {
  if [ ! -f "$VALUES_FILE" ]; then
    err "Values-File '$VALUES_FILE' nicht gefunden. Abbruch."
  fi
  info "Installiere Helm-Release '$RELEASE' mit values '$VALUES_FILE'"
  helm upgrade --install "$RELEASE" "$CHART" -n "$NAMESPACE" -f "$VALUES_FILE"
}

wait_pods_ready() {
  info "Warte bis alle Pods des Releases ready sind (Timeout $WAIT_TIMEOUT)..."
  # Warte auf Ready-Bedingung für alle Pods mit dem instance-Label
  if ! kubectl -n "$NAMESPACE" wait --for=condition=Ready pod -l app.kubernetes.io/instance="$RELEASE" --all --timeout="$WAIT_TIMEOUT"; then
    echo "WARNUNG: Nicht alle Pods sind innerhalb des Timeouts ready. Aktuelle Pods:"
    kubectl -n "$NAMESPACE" get pods -o wide
    return 1
  fi
  info "Alle Pods sind ready."
}

post_checks() {
  info "Prüfe smbclient im Nextcloud-Container (falls Pod läuft)..."
  POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/instance="$RELEASE",app.kubernetes.io/component=app -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)
  if [ -n "$POD" ]; then
    kubectl -n "$NAMESPACE" exec -it "$POD" -- sh -c 'command -v smbclient && smbclient -V || echo "smbclient nicht gefunden"'
  else
    info "Nextcloud-App-Pod nicht gefunden (noch nicht gestartet)."
  fi
  info "Führe 'occ files_external:backends' aus (falls Pod läuft)..."
  if [ -n "$POD" ]; then
    kubectl -n "$NAMESPACE" exec -it "$POD" -- sh -c 'php /var/www/html/occ files_external:backends || true'
  fi
}

main() {
  check_tools
  confirm
  create_namespace_if_missing

  uninstall_release
  delete_pvcs

#   recreate_configmap
#   add_helm_repo
#   install_release

#   # Warte auf Pods
#   if ! wait_pods_ready; then
#     info "Einige Pods sind möglicherweise nicht ready. Schaue in die Logs:"
#     kubectl -n "$NAMESPACE" get pods
#     kubectl -n "$NAMESPACE" logs -l app.kubernetes.io/instance="$RELEASE" --tail=100 || true
#   fi

#   post_checks

  echo
  echo "Fertig. Prüfe die Nextcloud-WebUI und gegebenenfalls die External Storage Einstellungen."
}

main "$@"