#!/bin/bash
#
# Backup database harian untuk aplikasi Presensi Kehadiran -- dijalankan
# lewat Cron Job cPanel (lihat DEPLOY.md bagian Backup Database).
#
# - Dump dikompres (.sql.gz) dan disimpan DI LUAR public_html, di
#   $HOME/backup-db-presensi -- supaya tidak bisa diunduh lewat browser
#   sama sekali, lepas dari document root diarahkan ke mana pun.
# - Kredensial DB dibaca dari .env aplikasi ini sendiri (DB_HOST,
#   DB_DATABASE, DB_USERNAME, DB_PASSWORD) -- tidak perlu diketik ulang
#   di tempat lain yang bisa lupa disinkronkan kalau password diganti.
# - Password DISEMBUNYIKAN dari daftar proses (`ps aux`) lewat file
#   kredensial sementara (--defaults-extra-file), BUKAN --password=...
#   di argumen command line yang bisa terlihat pengguna lain di shared
#   hosting selama proses dump berjalan.
# - Backup yang lebih tua dari RETENSI_HARI dihapus otomatis supaya tidak
#   menghabiskan kuota disk tanpa batas.

set -euo pipefail

APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
ENV_FILE="$APP_DIR/.env"
BACKUP_DIR="$HOME/backup-db-presensi"
RETENSI_HARI=14

if [ ! -f "$ENV_FILE" ]; then
    echo "File .env tidak ditemukan di $ENV_FILE" >&2
    exit 1
fi

ambil_env() {
    grep "^$1=" "$ENV_FILE" | head -n1 | cut -d '=' -f2- | tr -d '"'
}

DB_HOST=$(ambil_env DB_HOST)
DB_DATABASE=$(ambil_env DB_DATABASE)
DB_USERNAME=$(ambil_env DB_USERNAME)
DB_PASSWORD=$(ambil_env DB_PASSWORD)

mkdir -p "$BACKUP_DIR"
chmod 700 "$BACKUP_DIR"

CRED_FILE=$(mktemp)
chmod 600 "$CRED_FILE"
trap 'rm -f "$CRED_FILE"' EXIT

cat > "$CRED_FILE" <<CREDEOF
[client]
host=$DB_HOST
user=$DB_USERNAME
password=$DB_PASSWORD
CREDEOF

TANGGAL=$(date +%Y-%m-%d_%H%M%S)
FILE_TUJUAN="$BACKUP_DIR/${DB_DATABASE}_${TANGGAL}.sql.gz"

mysqldump --defaults-extra-file="$CRED_FILE" \
    --single-transaction --quick --routines --triggers \
    "$DB_DATABASE" | gzip > "$FILE_TUJUAN"

find "$BACKUP_DIR" -name "${DB_DATABASE}_*.sql.gz" -mtime +"$RETENSI_HARI" -delete

echo "Backup selesai: $FILE_TUJUAN"
