#!/usr/bin/env bash
set -euo pipefail

# ── rterm Slim Installer ────────────────────────────────────────────
# Kullanim: curl -fsSL https://www.rterm.com.tr/dl/install.sh | bash
# Sifir bagimlilik: Node.js, PM2, tum moduller paketin icinde.
# ────────────────────────────────────────────────────────────────────

INSTALL_DIR="/opt/rterm"
PORT=5788
BASE_URL="https://www.rterm.com.tr/dl"
PKG_NAME="rterm-linux-x64.tar.gz"

RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

log()  { echo -e "${GREEN}[rterm]${NC} $1"; }
warn() { echo -e "${YELLOW}[rterm]${NC} $1"; }
err()  { echo -e "${RED}[rterm]${NC} $1"; exit 1; }

# ── Uninstall ───────────────────────────────────────────────────────
if [[ "${1:-}" == "--uninstall" ]]; then
  log "rterm kaldiriliyor..."

  # PM2 process durdur
  if [[ -x "$INSTALL_DIR/bin/node" ]]; then
    "$INSTALL_DIR/bin/node" "$INSTALL_DIR/node_modules/pm2/bin/pm2" stop rterm 2>/dev/null || true
    "$INSTALL_DIR/bin/node" "$INSTALL_DIR/node_modules/pm2/bin/pm2" delete rterm 2>/dev/null || true
    "$INSTALL_DIR/bin/node" "$INSTALL_DIR/node_modules/pm2/bin/pm2" unstartup systemd 2>/dev/null || true
  fi

  # systemd servisi kaldir
  systemctl stop pm2-root 2>/dev/null || true
  systemctl disable pm2-root 2>/dev/null || true
  rm -f /etc/systemd/system/pm2-root.service
  systemctl daemon-reload 2>/dev/null || true

  # Firewall kapat
  if command -v firewall-cmd &>/dev/null; then
    firewall-cmd --permanent --remove-port=${PORT}/tcp 2>/dev/null || true
    firewall-cmd --reload 2>/dev/null || true
  elif command -v ufw &>/dev/null; then
    ufw delete allow ${PORT}/tcp 2>/dev/null || true
  elif command -v iptables &>/dev/null; then
    iptables -D INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null || true
    iptables-save > /etc/iptables.rules 2>/dev/null || true
  fi

  # Dizini sil
  rm -rf "$INSTALL_DIR" "${INSTALL_DIR}.bak"

  log "rterm basariyla kaldirildi."
  exit 0
fi

# ── Root kontrolu ──────────────────────────────────────────────────
[[ $EUID -ne 0 ]] && err "Root olarak calistirin: sudo bash install.sh"

log "rterm kurulumu basliyor..."

# ── Surum kontrolu ─────────────────────────────────────────────────
if [[ -f "$INSTALL_DIR/version.json" ]]; then
  LOCAL_VER=$(grep '"version"' "$INSTALL_DIR/version.json" 2>/dev/null | head -1 | sed 's/.*: *"//;s/".*//')
  REMOTE_VER=$(curl -fsSL "$BASE_URL/version.json" 2>/dev/null | grep '"version"' | head -1 | sed 's/.*: *"//;s/".*//') || true

  if [[ -n "$LOCAL_VER" && -n "$REMOTE_VER" && "$LOCAL_VER" == "$REMOTE_VER" ]]; then
    warn "rterm zaten guncel (v${LOCAL_VER})."
    read -rp "[rterm] Yeniden kurmak ister misiniz? (E/h): " choice
    case "${choice:-E}" in
      [Ee]|[Ee]vet|[Yy]|[Yy]es) log "Yeniden kurulum baslatiliyor..." ;;
      *) log "Kurulum iptal edildi."; exit 0 ;;
    esac
  fi

  if [[ -n "$REMOTE_VER" ]]; then
    log "Guncelleme mevcut: v${LOCAL_VER:-?} -> v${REMOTE_VER}"
  fi
fi

# ── Paketi indir ───────────────────────────────────────────────────
log "Paket indiriliyor..."
TMP_DIR=$(mktemp -d)
trap "rm -rf '$TMP_DIR'" EXIT

curl -fSL "$BASE_URL/$PKG_NAME" -o "$TMP_DIR/$PKG_NAME" || err "Paket indirilemedi"

log "Paket cikartiliyor..."
tar -xzf "$TMP_DIR/$PKG_NAME" -C "$TMP_DIR/"

# ── Eski kurulumu durdur ───────────────────────────────────────────
if [[ -x "$INSTALL_DIR/bin/node" && -f "$INSTALL_DIR/node_modules/pm2/bin/pm2" ]]; then
  log "Eski rterm durduruluyor..."
  "$INSTALL_DIR/bin/node" "$INSTALL_DIR/node_modules/pm2/bin/pm2" stop rterm 2>/dev/null || true
  "$INSTALL_DIR/bin/node" "$INSTALL_DIR/node_modules/pm2/bin/pm2" delete rterm 2>/dev/null || true
fi

# ── Atomik takas ───────────────────────────────────────────────────
if [[ -d "$INSTALL_DIR" ]]; then
  rm -rf "${INSTALL_DIR}.bak"
  mv "$INSTALL_DIR" "${INSTALL_DIR}.bak"
fi

mv "$TMP_DIR/rterm" "$INSTALL_DIR"

# ── Izinler ────────────────────────────────────────────────────────
chmod +x "$INSTALL_DIR/bin/node"
chmod +x "$INSTALL_DIR/rterm.sh"

# ── Servisi baslat ─────────────────────────────────────────────────
log "rterm baslatiliyor..."
"$INSTALL_DIR/rterm.sh" start

# ── Otomatik baslatma (systemd + PM2) ─────────────────────────────
NODE="$INSTALL_DIR/bin/node"
PM2="$INSTALL_DIR/node_modules/pm2/bin/pm2"

# PM2 process listesini kaydet
"$NODE" "$PM2" save 2>/dev/null || true

# systemd servisi olustur
"$NODE" "$PM2" startup systemd -u root --hp /root 2>/dev/null || true
systemctl enable pm2-root 2>/dev/null || true

# ── Firewall ───────────────────────────────────────────────────────
log "Firewall yapilandiriliyor (port ${PORT})..."

if command -v firewall-cmd &>/dev/null; then
  firewall-cmd --permanent --add-port=${PORT}/tcp 2>/dev/null || true
  firewall-cmd --reload 2>/dev/null || true
elif command -v ufw &>/dev/null; then
  ufw allow ${PORT}/tcp 2>/dev/null || true
elif command -v iptables &>/dev/null; then
  iptables -C INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null || \
    iptables -I INPUT -p tcp --dport ${PORT} -j ACCEPT 2>/dev/null || true
  iptables-save > /etc/iptables.rules 2>/dev/null || true
fi

# ── Eski yedegi temizle ────────────────────────────────────────────
rm -rf "${INSTALL_DIR}.bak"

# ── Basari ─────────────────────────────────────────────────────────
IP=$(hostname -I 2>/dev/null | awk '{print $1}' || echo "SUNUCU_IP")
VER=$(grep '"version"' "$INSTALL_DIR/version.json" 2>/dev/null | head -1 | sed 's/.*: *"//;s/".*//') || VER="?"

echo ""
echo -e "${GREEN}════════════════════════════════════════════${NC}"
echo -e "${GREEN}  rterm v${VER} basariyla kuruldu!${NC}"
echo -e "${GREEN}════════════════════════════════════════════${NC}"
echo ""
echo -e "  ${CYAN}Erisim:${NC} http://${IP}:${PORT}"
echo ""
echo -e "  ${CYAN}Yonetim komutlari:${NC}"
echo -e "    ${INSTALL_DIR}/rterm.sh start"
echo -e "    ${INSTALL_DIR}/rterm.sh stop"
echo -e "    ${INSTALL_DIR}/rterm.sh restart"
echo -e "    ${INSTALL_DIR}/rterm.sh status"
echo -e "    ${INSTALL_DIR}/rterm.sh logs"
echo ""
echo -e "  ${CYAN}Kaldirmak icin:${NC}"
echo -e "    bash ${INSTALL_DIR}/../install.sh --uninstall"
echo -e "    veya: curl -fsSL ${BASE_URL}/install.sh | bash -s -- --uninstall"
echo ""
