#!/usr/bin/env bash
# ============================================================================
# PROCP — Docker turnkey tek-satır installer (PRC-1128)
#   curl -fsSL https://get.procp.net/install-docker.sh | bash
# Boş bir dizinde tek komutla: compose + .env indir → secret üret → stack up.
# Sonra tarayıcıda http://<host>[:APP_PORT]/install ile sihirbazı bitir.
#
# Override (pipe'ta bash'ten ÖNCE set et; script stdin'den okunur, env'i görür):
#   curl -fsSL https://get.procp.net/install-docker.sh | APP_PORT=8088 bash
#   curl -fsSL https://get.procp.net/install-docker.sh | APP_PORT=8088 REVERB_PUBLIC_PORT=8091 PROCP_TARGET=/opt/procp bash
#
# Override env:
#   PROCP_BASE          artefakt/host kök URL (vars. https://releases.procp.net)
#   PROCP_TARGET        kurulum dizini        (vars. $PWD/procp)
#   PROCP_IMAGE         registry imajı        (compose ${PROCP_IMAGE:-bakcay/procp:latest})
#   PROCP_DOMAIN        site alan adı         → APP_URL (vars. yazılmaz; install.sh --domain geçer)
#   APP_PORT            web portu             (vars. 80)
#   REVERB_PUBLIC_PORT  websocket portu       (vars. 8080)
# ============================================================================
set -euo pipefail

BASE="${PROCP_BASE:-https://releases.procp.net}"
TARGET="${PROCP_TARGET:-$PWD/procp}"
COMPOSE="docker-compose.prod.yml"

command -v docker >/dev/null || { echo "✗ docker gerekli"; exit 1; }
docker compose version >/dev/null 2>&1 || { echo "✗ docker compose v2 gerekli"; exit 1; }
command -v curl >/dev/null || { echo "✗ curl gerekli"; exit 1; }

echo "▸ hedef dizin: $TARGET"
mkdir -p "$TARGET"; cd "$TARGET"

echo "▸ compose + .env.example indiriliyor ($BASE)"
curl -fsSL "$BASE/$COMPOSE"     -o "$COMPOSE"
curl -fsSL "$BASE/.env.example" -o ".env.example"

rnd() { openssl rand -hex 16 2>/dev/null || head -c16 /dev/urandom | od -An -tx1 | tr -d ' \n'; }

# key=value satırını yerinde değiştir (BSD/GNU sed uyumsuzluğundan kaçın → awk)
set_env() {
  if grep -qE "^$1=" .env 2>/dev/null; then
    awk -v k="$1" -v v="$2" 'BEGIN{FS=OFS="="} $1==k{print k"="v; next} {print}' .env > .env.tmp && mv .env.tmp .env
  else
    printf '%s=%s\n' "$1" "$2" >> .env
  fi
}

if [ ! -f .env ]; then
  echo "▸ .env üretiliyor (rastgele secret'lar)"
  cp .env.example .env
  # APP_KEY'i BURADA üret (kalıcı + geçerli). Entrypoint'e bırakılırsa compose
  # env_file boş APP_KEY='i container'a env var olarak enjekte edip dosyaya
  # yazılan key'i ezer → "No application encryption key" 500 (PRC-1131).
  set_env APP_KEY           "base64:$(openssl rand -base64 32)"
  set_env DB_PASSWORD       "$(rnd)"
  set_env MEILISEARCH_KEY   "$(rnd)"
  set_env REVERB_APP_ID     "procp"
  set_env REVERB_APP_KEY    "$(rnd)"
  set_env REVERB_APP_SECRET "$(rnd)"
  # PROCP_LICENSE_KEY /install sihirbazında girilir.
  [ -n "${APP_PORT:-}" ]           && set_env APP_PORT "$APP_PORT"
  [ -n "${REVERB_PUBLIC_PORT:-}" ] && set_env REVERB_PUBLIC_PORT "$REVERB_PUBLIC_PORT"
  # APP_URL: doğrudan APP_URL verilirse onu, yoksa PROCP_DOMAIN'den kur
  # (http; TLS sonrası https'e çevrilir). Port 80 değilse URL'ye eklenir.
  if [ -n "${APP_URL:-}" ]; then
    set_env APP_URL "$APP_URL"
  elif [ -n "${PROCP_DOMAIN:-}" ]; then
    _p="${APP_PORT:-80}"; _sfx=""; [ "$_p" != "80" ] && _sfx=":$_p"
    set_env APP_URL "http://${PROCP_DOMAIN}${_sfx}"
  fi
else
  echo "▸ .env zaten var — korunuyor (secret'lar yeniden üretilmez)"
fi

echo "▸ imaj çekiliyor (registry: ${PROCP_IMAGE:-procp:latest})"
docker compose -f "$COMPOSE" pull 2>/dev/null || echo "  (pull atlandı — lokal imaj kullanılacak)"

echo "▸ stack başlatılıyor"
docker compose -f "$COMPOSE" up -d

PORT="${APP_PORT:-80}"
SUFFIX=""; [ "$PORT" != "80" ] && SUFFIX=":$PORT"
HOST="${PROCP_DOMAIN:-localhost}"
cat <<EOF

✓ PROCP stack çalışıyor.
  Kurulumu tamamla →  http://${HOST}${SUFFIX}/install
  Durum   :  docker compose -f "$TARGET/$COMPOSE" ps
  Loglar  :  docker compose -f "$TARGET/$COMPOSE" logs -f app
  Durdur  :  docker compose -f "$TARGET/$COMPOSE" down
  Sil     :  docker compose -f "$TARGET/$COMPOSE" down -v   (veri volume'ları dahil)
EOF
