#!/usr/bin/env bash
# Installer untuk 'redeploy' (docker compose pull -> down -> up -d)
#
# Install  : curl -fsSL <URL>/install.sh | sudo bash
# Uninstall: curl -fsSL <URL>/install.sh | sudo bash -s -- --uninstall

set -euo pipefail

INSTALL_DIR="${INSTALL_DIR:-/usr/local/bin}"
TARGET="$INSTALL_DIR/redeploy"

info() { printf '\033[1;32m[+]\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*"; }
err()  { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }

[[ $EUID -eq 0 ]] || err "Jalankan dengan sudo/root."

if [[ "${1:-}" == "--uninstall" ]]; then
  rm -f "$TARGET"
  info "redeploy dihapus dari $TARGET"
  exit 0
fi

command -v docker >/dev/null 2>&1 || err "Docker belum terpasang."
docker compose version >/dev/null 2>&1 || err "Plugin 'docker compose' (v2) belum terpasang."

mkdir -p "$INSTALL_DIR"

cat > "$TARGET" <<'REDEPLOY_EOF'
#!/usr/bin/env bash
# redeploy - pull image terbaru lalu deploy ulang docker compose
# di direktori saat ini (atau direktori yang diberikan sebagai argumen).
#
# Pemakaian:
#   redeploy              # jalankan di direktori sekarang
#   redeploy /opt/app     # jalankan di direktori tertentu
#   redeploy -q           # quick: tanpa 'down' (pull + up -d saja)
#   redeploy -p           # sekalian hapus image lama (prune)
#   redeploy -h           # bantuan

set -euo pipefail

QUICK=0
PRUNE=0

usage() {
  sed -n '2,11p' "$0" | sed 's/^# \{0,1\}//'
  exit 0
}

while getopts ":qph" opt; do
  case "$opt" in
    q) QUICK=1 ;;
    p) PRUNE=1 ;;
    h) usage ;;
    *) echo "Opsi tidak dikenal: -$OPTARG" >&2; exit 1 ;;
  esac
done
shift $((OPTIND - 1))

TARGET="${1:-$PWD}"
cd "$TARGET" || { echo "Direktori tidak ditemukan: $TARGET" >&2; exit 1; }

COMPOSE_FILE=""
for f in compose.yaml compose.yml docker-compose.yaml docker-compose.yml; do
  if [[ -f "$f" ]]; then COMPOSE_FILE="$f"; break; fi
done

if [[ -z "$COMPOSE_FILE" ]]; then
  echo "Tidak ada file compose di $(pwd)" >&2
  exit 1
fi

log() { printf '\033[1;34m==>\033[0m %s\n' "$*"; }

log "Redeploy di $(pwd) ($COMPOSE_FILE)"

log "Pull image terbaru..."
docker compose pull

if [[ "$QUICK" -eq 0 ]]; then
  log "Menghentikan container..."
  docker compose down
fi

log "Menjalankan container..."
docker compose up -d

if [[ "$PRUNE" -eq 1 ]]; then
  log "Menghapus image lama yang tidak terpakai..."
  docker image prune -f
fi

log "Status:"
docker compose ps
REDEPLOY_EOF

chmod 755 "$TARGET"
info "redeploy terpasang di $TARGET"

case ":$PATH:" in
  *":$INSTALL_DIR:"*) ;;
  *) warn "$INSTALL_DIR belum ada di PATH, tambahkan ke ~/.bashrc" ;;
esac

info "Coba: cd /path/ke/project && redeploy -h"
