#!/usr/bin/env bash
# Helpers communs backup / restore OVH Sherlook.

set -euo pipefail

API_DIR="${API_DIR:-$HOME/api-26}"
BACKUP_ROOT="${BACKUP_ROOT:-$HOME/backups}"
KEEP_DAYS="${KEEP_DAYS:-14}"

ensure_dirs() {
  mkdir -p "$BACKUP_ROOT"
  if [[ ! -d "$API_DIR" ]]; then
    echo "ERREUR : API_DIR introuvable : $API_DIR" >&2
    echo "Définir API_DIR=/chemin/vers/api-26" >&2
    exit 1
  fi
  if [[ ! -f "$API_DIR/.env" ]]; then
    echo "ERREUR : .env introuvable dans $API_DIR" >&2
    exit 1
  fi
}

# Exporte DB_USER DB_PASS DB_HOST DB_PORT DB_NAME depuis DATABASE_URL du .env serveur.
load_database_url() {
  local parsed
  parsed="$(
    php -r '
      $envFile = $argv[1];
      $raw = file_get_contents($envFile);
      if ($raw === false) {
        fwrite(STDERR, "Impossible de lire .env\n");
        exit(1);
      }
      if (!preg_match("/^DATABASE_URL\s*=\s*(.+)$/m", $raw, $m)) {
        fwrite(STDERR, "DATABASE_URL introuvable dans .env\n");
        exit(1);
      }
      $url = trim($m[1]);
      $url = trim($url, "\"'\''");
      $p = parse_url($url);
      if (!$p || empty($p["host"]) || empty($p["path"])) {
        fwrite(STDERR, "DATABASE_URL invalide\n");
        exit(1);
      }
      $user = $p["user"] ?? "";
      $pass = isset($p["pass"]) ? rawurldecode($p["pass"]) : "";
      $host = $p["host"];
      $port = (string) ($p["port"] ?? 3306);
      $name = ltrim($p["path"], "/");
      echo $user, "\n", $pass, "\n", $host, "\n", $port, "\n", $name, "\n";
    ' "$API_DIR/.env"
  )"

  DB_USER="$(printf '%s\n' "$parsed" | sed -n '1p')"
  DB_PASS="$(printf '%s\n' "$parsed" | sed -n '2p')"
  DB_HOST="$(printf '%s\n' "$parsed" | sed -n '3p')"
  DB_PORT="$(printf '%s\n' "$parsed" | sed -n '4p')"
  DB_NAME="$(printf '%s\n' "$parsed" | sed -n '5p')"

  if [[ -z "$DB_USER" || -z "$DB_HOST" || -z "$DB_NAME" ]]; then
    echo "ERREUR : impossible de parser DATABASE_URL" >&2
    exit 1
  fi
}

prune_old_backups() {
  local keep="${KEEP_DAYS:-14}"
  if [[ ! "$keep" =~ ^[0-9]+$ ]] || [[ "$keep" -le 0 ]]; then
    return 0
  fi
  find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d -mtime +"$keep" -print0 \
    | while IFS= read -r -d '' dir; do
        echo "    suppression ancienne sauvegarde : $(basename "$dir")"
        rm -rf "$dir"
      done
}

resolve_backup_dir() {
  local stamp="$1"
  if [[ -z "$stamp" ]]; then
    echo "ERREUR : indiquez le stamp (ex. 20260719_043000) ou le chemin complet." >&2
    exit 1
  fi
  if [[ -d "$stamp" ]]; then
    echo "$stamp"
    return 0
  fi
  if [[ -d "$BACKUP_ROOT/$stamp" ]]; then
    echo "$BACKUP_ROOT/$stamp"
    return 0
  fi
  echo "ERREUR : sauvegarde introuvable : $stamp" >&2
  echo "Disponibles :" >&2
  ls -1 "$BACKUP_ROOT" 2>/dev/null >&2 || true
  exit 1
}
