#!/bin/bash
# ╔══════════════════════════════════════════════════════════════════╗
# ║   Discord Guard Dashboard — cPanel Başlatma Scripti             ║
# ║   Versiyon: 4.0 | cPanel Node.js Selector Uyumlu               ║
# ╚══════════════════════════════════════════════════════════════════╝
# Kullanım: chmod +x cpanel_start.sh && ./cpanel_start.sh

set -o pipefail

# ─── Renkler ─────────────────────────────────────────────────────
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'

log()    { echo -e "${GREEN}[✔]${NC} $1"; }
warn()   { echo -e "${YELLOW}[!]${NC} $1"; }
error()  { echo -e "${RED}[✘]${NC} $1"; }
info()   { echo -e "${CYAN}[i]${NC} $1"; }
header() {
  echo ""
  echo -e "${BLUE}${BOLD}════════════════════════════════════════${NC}"
  echo -e "${BLUE}${BOLD}  $1${NC}"
  echo -e "${BLUE}${BOLD}════════════════════════════════════════${NC}"
}

fatal() {
  error "$1"
  [ -f "$ERROR_FILE" ] && echo "" && tail -30 "$ERROR_FILE"
  exit 1
}

# ─── Proje Kök Dizini ─────────────────────────────────────────────
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"

PID_FILE="$SCRIPT_DIR/.app.pid"
LOG_FILE="$SCRIPT_DIR/logs/app.log"
ERROR_FILE="$SCRIPT_DIR/logs/error.log"

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 1: cPanel Node.js Sanal Ortamı Aktifleştir
# ══════════════════════════════════════════════════════════════════
header "1/6 ─ Node.js Ortamı Aktifleştiriliyor"

# ── cPanel nodevenv'i otomatik bul ve aktifleştir ─────────────────
# cPanel Node.js Selector, her uygulama için şu konumda venv oluşturur:
# /home/$USER/nodevenv/<APP_DOMAIN>/<NODE_VERSION>/bin/activate
#
# Ekran görüntüsünden alınan gerçek yol:
# source /home/bossbot1/nodevenv/rnatac.bossbot.shop/22/bin/activate

CPANEL_VENV_ACTIVATED=false

# Yöntem 1: Proje adına göre nodevenv'i otomatik tara
WHOAMI=$(whoami)
NODEVENV_BASE="$HOME/nodevenv"

if [ -d "$NODEVENV_BASE" ]; then
  # En yüksek Node sürümlü venv'i bul (22 > 20 > 18)
  BEST_ACTIVATE=""
  BEST_VER=0

  # Tüm alt dizinleri tara: nodevenv/<domain>/<version>/bin/activate
  while IFS= read -r ACTIVATE_FILE; do
    VER=$(echo "$ACTIVATE_FILE" | grep -oP '/\K[0-9]+(?=/bin/activate)' || echo "0")
    if [ "$VER" -gt "$BEST_VER" ] 2>/dev/null; then
      BEST_VER="$VER"
      BEST_ACTIVATE="$ACTIVATE_FILE"
    fi
  done < <(find "$NODEVENV_BASE" -name "activate" -path "*/bin/activate" 2>/dev/null)

  if [ -n "$BEST_ACTIVATE" ]; then
    info "cPanel venv bulundu: $BEST_ACTIVATE"
    source "$BEST_ACTIVATE"
    CPANEL_VENV_ACTIVATED=true
    log "cPanel Node.js sanal ortamı aktif (Node $BEST_VER)"
  fi
fi

# Yöntem 2: NVM fallback
if [ "$CPANEL_VENV_ACTIVATED" = false ]; then
  export NVM_DIR="$HOME/.nvm"
  [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
  warn "cPanel venv bulunamadı, NVM fallback kullanılıyor"
fi

# Yöntem 3: Bash profil kaynaklarını yükle
[ -f "$HOME/.bash_profile" ] && source "$HOME/.bash_profile" 2>/dev/null || true
[ -f "$HOME/.bashrc" ]       && source "$HOME/.bashrc"       2>/dev/null || true

# ── Node.js doğrulama ─────────────────────────────────────────────
if ! command -v node &>/dev/null; then
  fatal "Node.js bulunamadı! cPanel → Software → Node.js Selector'dan uygulama oluşturun."
fi

NODE_VERSION=$(node --version)
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d'v' -f2 | cut -d'.' -f1)
NODE_BIN=$(command -v node)
NPM_BIN=$(command -v npm)

if [ "$NODE_MAJOR" -lt 18 ]; then
  fatal "Node.js 18+ gerekli! Mevcut: $NODE_VERSION"
fi

log "Node.js $NODE_VERSION aktif"
log "npm $(npm --version)"
info "Node yolu: $NODE_BIN"

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 2: .env Dosyası Kontrol
# ══════════════════════════════════════════════════════════════════
header "2/6 ─ Ortam Değişkenleri (.env)"

if [ ! -f "$SCRIPT_DIR/.env" ]; then
  if [ -f "$SCRIPT_DIR/.env.example" ]; then
    cp "$SCRIPT_DIR/.env.example" "$SCRIPT_DIR/.env"
    warn ".env dosyası oluşturuldu! Düzenleyin: nano $SCRIPT_DIR/.env"
    exit 0
  else
    fatal ".env dosyası bulunamadı!"
  fi
fi

set -a
source "$SCRIPT_DIR/.env"
set +a

MISSING=()
[ -z "$DISCORD_TOKEN" ]     && MISSING+=("DISCORD_TOKEN")
[ -z "$DISCORD_CLIENT_ID" ] && MISSING+=("DISCORD_CLIENT_ID")
[ -z "$SESSION_SECRET" ]    && MISSING+=("SESSION_SECRET")

if [ ${#MISSING[@]} -gt 0 ]; then
  error ".env içinde eksik değişkenler:"
  for V in "${MISSING[@]}"; do echo -e "    ${RED}→ $V${NC}"; done
  exit 1
fi

log ".env doğrulandı ✔"
info "PORT: ${PORT:-3000} | NODE_ENV: ${NODE_ENV:-production}"

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 3: Dizin Hazırlığı
# ══════════════════════════════════════════════════════════════════
header "3/6 ─ Dizinler Hazırlanıyor"

mkdir -p "$SCRIPT_DIR/logs"
mkdir -p "$SCRIPT_DIR/music"
mkdir -p "$SCRIPT_DIR/src/web/public/uploads"
log "Dizinler hazır: logs/, music/, uploads/"

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 4: Bağımlılık Kurulumu
# ══════════════════════════════════════════════════════════════════
header "4/6 ─ Node.js Bağımlılıkları Kuruluyor"

cd "$SCRIPT_DIR"

# Bozuk kurulum tespiti
NEEDS_INSTALL=false
if [ ! -d "node_modules" ]; then
  NEEDS_INSTALL=true
  info "node_modules bulunamadı, kurulum başlatılıyor..."
elif [ ! -f "node_modules/express/package.json" ]; then
  warn "Bozuk kurulum tespit edildi (express eksik), yeniden kuruluyor..."
  rm -rf node_modules package-lock.json
  NEEDS_INSTALL=true
fi

if [ "$NEEDS_INSTALL" = true ]; then
  # Birincil kurulum — cPanel venv aktifse node_modules doğru yere kurulur
  "$NPM_BIN" install \
    --no-audit \
    --no-fund \
    --legacy-peer-deps \
    --engine-strict=false \
    2>&1

  # Kritik kontrol
  if [ ! -f "node_modules/express/package.json" ]; then
    warn "İlk kurulum başarısız, --ignore-scripts ile tekrar deneniyor..."
    rm -rf node_modules package-lock.json 2>/dev/null || true

    "$NPM_BIN" install \
      --no-audit \
      --no-fund \
      --legacy-peer-deps \
      --engine-strict=false \
      --ignore-scripts \
      2>&1

    [ ! -f "node_modules/express/package.json" ] && fatal "npm install iki denemede de başarısız!"
    warn "Kurulum --ignore-scripts ile tamamlandı (bazı native modüller eksik olabilir)"
  else
    log "npm bağımlılıkları kuruldu ✔"
  fi
else
  log "Bağımlılıklar güncel, kurulum atlanıyor"
fi

# better-sqlite3 çalışma testi
info "better-sqlite3 test ediliyor..."
if "$NODE_BIN" -e "require('better-sqlite3')" 2>/dev/null; then
  log "better-sqlite3 çalışıyor ✔"
else
  warn "better-sqlite3 yüklenemedi, yeniden derleniyor..."
  "$NPM_BIN" rebuild better-sqlite3 2>&1 | tail -5
  if "$NODE_BIN" -e "require('better-sqlite3')" 2>/dev/null; then
    log "better-sqlite3 onarıldı ✔"
  else
    warn "better-sqlite3 native build başarısız — uygulama başlatılıyor (DB hatası olabilir)"
  fi
fi

# ── Frontend Build ────────────────────────────────────────────────
if [ -d "$SCRIPT_DIR/frontend" ] && [ -f "$SCRIPT_DIR/frontend/package.json" ]; then
  cd "$SCRIPT_DIR/frontend"

  if [ ! -d "node_modules" ]; then
    info "Frontend bağımlılıkları kuruluyor..."
    "$NPM_BIN" install \
      --no-audit \
      --no-fund \
      --legacy-peer-deps \
      --engine-strict=false \
      2>&1 | tail -5
    log "Frontend bağımlılıkları kuruldu"
  fi

  # Vite'yi local binary üzerinden çalıştır (PATH bağımsız)
  VITE_BIN="$SCRIPT_DIR/frontend/node_modules/.bin/vite"

  if [ -f "$VITE_BIN" ]; then
    info "Frontend build ediliyor..."
    "$VITE_BIN" build 2>&1 | tail -15
    [ $? -eq 0 ] && log "Frontend build tamamlandı ✔" || warn "Frontend build başarısız"
  else
    warn "vite bulunamadı: $VITE_BIN"
    warn "Manuel: cd frontend && npx vite build"
  fi

  cd "$SCRIPT_DIR"
fi

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 5: Önceki Süreç Temizle
# ══════════════════════════════════════════════════════════════════
header "5/6 ─ Önceki Süreç Kontrol Ediliyor"

if [ -f "$PID_FILE" ]; then
  OLD_PID=$(cat "$PID_FILE" 2>/dev/null)
  if [ -n "$OLD_PID" ] && kill -0 "$OLD_PID" 2>/dev/null; then
    info "Eski süreç durduruluyor (PID: $OLD_PID)..."
    kill "$OLD_PID" 2>/dev/null
    sleep 2
    kill -0 "$OLD_PID" 2>/dev/null && kill -9 "$OLD_PID" 2>/dev/null || true
    log "Eski süreç durduruldu"
  fi
  rm -f "$PID_FILE"
fi

APP_PORT="${PORT:-3000}"
if command -v lsof &>/dev/null; then
  PORT_PID=$(lsof -ti :"$APP_PORT" 2>/dev/null || true)
  if [ -n "$PORT_PID" ]; then
    warn "Port $APP_PORT meşgul (PID: $PORT_PID), temizleniyor..."
    kill "$PORT_PID" 2>/dev/null || true
    sleep 1
    log "Port $APP_PORT serbest"
  fi
fi

# ══════════════════════════════════════════════════════════════════
# BÖLÜM 6: Uygulamayı Başlat
# ══════════════════════════════════════════════════════════════════
header "6/6 ─ Uygulama Başlatılıyor"

cd "$SCRIPT_DIR"

# Log rotasyonu (10MB üzeri)
[ -f "$LOG_FILE" ] && [ "$(wc -c < "$LOG_FILE" 2>/dev/null || echo 0)" -gt 10485760 ] && \
  mv "$LOG_FILE" "${LOG_FILE%.log}_$(date +%Y%m%d_%H%M%S).log" && info "Eski log arşivlendi"

# Hata logunu sıfırla
> "$ERROR_FILE"

info "Kullanılan node: $NODE_BIN ($NODE_VERSION)"

# Başlat
nohup "$NODE_BIN" src/web/server.js >> "$LOG_FILE" 2>> "$ERROR_FILE" &
APP_PID=$!
echo "$APP_PID" > "$PID_FILE"

# 5 saniye bekle ve doğrula
info "Başlatma doğrulanıyor (5 saniye)..."
sleep 5

if kill -0 "$APP_PID" 2>/dev/null; then
  log "Uygulama çalışıyor! (PID: $APP_PID)"
else
  rm -f "$PID_FILE"
  echo ""
  error "Uygulama başlatılamadı!"
  echo ""
  echo -e "${YELLOW}  ─── Hata Logları ───────────────────────────${NC}"
  cat "$ERROR_FILE" 2>/dev/null || echo "  (log boş)"
  echo ""
  echo -e "${CYAN}  İpuçları:${NC}"
  echo "  → node src/web/server.js   (terminal'de doğrudan çalıştır)"
  echo "  → tail -f logs/error.log   (canlı hata takibi)"
  exit 1
fi

# ══════════════════════════════════════════════════════════════════
# ÖZET
# ══════════════════════════════════════════════════════════════════
echo ""
echo -e "${GREEN}${BOLD}╔══════════════════════════════════════════════╗${NC}"
echo -e "${GREEN}${BOLD}║   🚀  UYGULAMA BAŞARILI BAŞLATILDI!          ║${NC}"
echo -e "${GREEN}${BOLD}╠══════════════════════════════════════════════╣${NC}"
printf "${GREEN}${BOLD}║${NC}  PID   : ${CYAN}${BOLD}%-34s${NC}${GREEN}${BOLD}║${NC}\n" "$APP_PID"
printf "${GREEN}${BOLD}║${NC}  Port  : ${CYAN}${BOLD}%-34s${NC}${GREEN}${BOLD}║${NC}\n" "$APP_PORT"
printf "${GREEN}${BOLD}║${NC}  Node  : ${CYAN}${BOLD}%-34s${NC}${GREEN}${BOLD}║${NC}\n" "$NODE_VERSION"
echo -e "${GREEN}${BOLD}║${NC}  Log   : logs/app.log                        ${GREEN}${BOLD}║${NC}"
echo -e "${GREEN}${BOLD}║${NC}  Hata  : logs/error.log                      ${GREEN}${BOLD}║${NC}"
echo -e "${GREEN}${BOLD}╠══════════════════════════════════════════════╣${NC}"
echo -e "${GREEN}${BOLD}║${NC}  ./cpanel_stop.sh     → Durdur              ${GREEN}${BOLD}║${NC}"
echo -e "${GREEN}${BOLD}║${NC}  ./cpanel_status.sh   → Durum               ${GREEN}${BOLD}║${NC}"
echo -e "${GREEN}${BOLD}║${NC}  tail -f logs/app.log → Canlı Log           ${GREEN}${BOLD}║${NC}"
echo -e "${GREEN}${BOLD}╚══════════════════════════════════════════════╝${NC}"
echo ""
