#!/bin/sh
set -eu

SCRIPT_DIR="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
PROJECT_ROOT="$(dirname "$SCRIPT_DIR")"
cd "$PROJECT_ROOT"

if [ ! -f "artisan" ]; then
  echo "Erreur: lance ce script depuis un projet Laravel (artisan introuvable)." >&2
  exit 1
fi

if ! command -v mysqldump >/dev/null 2>&1; then
  echo "Erreur: mysqldump introuvable sur ce serveur." >&2
  exit 1
fi

if [ ! -f ".env" ]; then
  echo "Erreur: fichier .env introuvable dans $PROJECT_ROOT" >&2
  exit 1
fi

# Lecture ligne par ligne (compatible .env Laravel, espaces, guillemets).
read_env() {
  php -r "$(cat <<'PHP'
$path = ".env";
$key = $argv[1];
if (! is_readable($path)) {
    fwrite(STDERR, "Erreur: .env illisible\n");
    exit(1);
}
$raw = file_get_contents($path);
if ($raw === false) {
    fwrite(STDERR, "Erreur: impossible de lire .env\n");
    exit(1);
}
$raw = preg_replace("/^\xEF\xBB\xBF/", "", $raw);
$lines = preg_split("/\R/", $raw) ?: [];
foreach ($lines as $line) {
    $line = rtrim($line, "\r\n");
    if ($line === "" || preg_match("/^\s*#/", $line)) {
        continue;
    }
    if (! preg_match("/^\s*(?i:export\s+)?" . preg_quote($key, "/") . "\s*=\s*(.*)$/", $line, $m)) {
        continue;
    }
    $v = trim($m[1]);
    if ($v !== "" && ($v[0] === '"' || $v[0] === chr(39))) {
        $q = $v[0];
        if (str_ends_with($v, $q) && strlen($v) >= 2) {
            $v = substr($v, 1, -1);
        }
    }
    echo $v;
    exit(0);
}
exit(0);
PHP
)" "$1"
}

DB_CONNECTION="$(read_env DB_CONNECTION)"
DB_HOST="$(read_env DB_HOST)"
DB_PORT="$(read_env DB_PORT)"
DB_DATABASE="$(read_env DB_DATABASE)"
DB_USERNAME="$(read_env DB_USERNAME)"
DB_PASSWORD="$(read_env DB_PASSWORD)"
DB_PORT="${DB_PORT:-3306}"

if [ "${DB_CONNECTION:-}" != "mysql" ]; then
  echo "Erreur: DB_CONNECTION=${DB_CONNECTION:-vide}. Ce script supporte seulement mysql." >&2
  exit 1
fi

if [ -z "${DB_HOST:-}" ] || [ -z "${DB_PORT:-}" ] || [ -z "${DB_DATABASE:-}" ] || [ -z "${DB_USERNAME:-}" ]; then
  echo "Erreur: variables DB incomplètes dans .env" >&2
  exit 1
fi

BACKUP_DIR="storage/backups"
mkdir -p "$BACKUP_DIR"
STAMP="$(date +%Y%m%d_%H%M%S)"
SQL_FILE="$BACKUP_DIR/db_${STAMP}.sql"

echo "Backup MySQL -> $SQL_FILE"
# Sans privilège PROCESS sur MySQL 8+ (mutualisé).
MYSQL_PWD="$DB_PASSWORD" mysqldump \
  --host="$DB_HOST" \
  --port="$DB_PORT" \
  --user="$DB_USERNAME" \
  --single-transaction \
  --quick \
  --no-tablespaces \
  "$DB_DATABASE" > "$SQL_FILE"

if command -v gzip >/dev/null 2>&1; then
  gzip -f "$SQL_FILE"
  echo "Backup termine: ${SQL_FILE}.gz"
else
  echo "Backup termine: $SQL_FILE"
fi
