#!/bin/bash
# ============================================================
# StreamHub — Deploy Script
# Jalankan dari direktori root proyek (tempat pnpm-workspace.yaml)
# ============================================================
set -e

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

log()  { echo -e "${GREEN}[OK]${NC} $1"; }
info() { echo -e "${BLUE}[>>]${NC} $1"; }
warn() { echo -e "${YELLOW}[!!]${NC} $1"; }
die()  { echo -e "${RED}[ERR]${NC} $1"; exit 1; }

APP_DIR="/opt/streamhub"
WEB_DIR="/var/www/streamhub"
LOG_DIR="/var/log/streamhub"
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"

# Cek dari direktori yang benar
[ -f "$ROOT_DIR/pnpm-workspace.yaml" ] || die "Jalankan dari root proyek!"

info "Root proyek: $ROOT_DIR"

# ── 1. Install semua dependencies ────────────────────────────
info "Install dependencies..."
cd "$ROOT_DIR"
pnpm install --frozen-lockfile
log "Dependencies installed"

# ── 2. Build API Server ──────────────────────────────────────
info "Build API server..."
pnpm --filter @workspace/api-server run build
log "API server built → artifacts/api-server/dist/"

# ── 3. Build Frontend ────────────────────────────────────────
info "Build frontend..."
NODE_ENV=production BASE_PATH=/ PORT=3000 \
    pnpm --filter @workspace/streamhub run build
log "Frontend built → artifacts/streamhub/dist/public/"

# ── 4. Deploy file ke direktori produksi ─────────────────────
info "Deploy files..."

# Copy API server
mkdir -p "$APP_DIR"
cp -r "$ROOT_DIR/artifacts/api-server/dist" "$APP_DIR/api-server-dist"
cp "$ROOT_DIR/artifacts/api-server/package.json" "$APP_DIR/"
cp "$ROOT_DIR/deploy/ecosystem.config.cjs" "$APP_DIR/"

# Copy node_modules yang diperlukan API server
cp -r "$ROOT_DIR/node_modules" "$APP_DIR/" 2>/dev/null || true

# Copy frontend ke web root
rm -rf "$WEB_DIR"/*
cp -r "$ROOT_DIR/artifacts/streamhub/dist/public/." "$WEB_DIR/"
cp -r "$ROOT_DIR/artifacts/streamhub/public/." "$WEB_DIR/" 2>/dev/null || true

# Sitemap XML
[ -f "$ROOT_DIR/artifacts/streamhub/public/sitemap.xml" ] && \
    cp "$ROOT_DIR/artifacts/streamhub/public/sitemap.xml" "$WEB_DIR/"
[ -f "$ROOT_DIR/artifacts/streamhub/public/robots.txt" ] && \
    cp "$ROOT_DIR/artifacts/streamhub/public/robots.txt" "$WEB_DIR/"

log "Files deployed"

# ── 5. Start/Restart API server dengan PM2 ───────────────────
info "Start API server..."
mkdir -p "$LOG_DIR"
cd "$APP_DIR"

# Buat script wrapper untuk API server
cat > "$APP_DIR/start.sh" << 'EOF'
#!/bin/bash
export NODE_ENV=production
export PORT=8080
export LOG_LEVEL=info
exec node --enable-source-maps /opt/streamhub/api-server-dist/index.mjs
EOF
chmod +x "$APP_DIR/start.sh"

if pm2 describe streamhub-api &>/dev/null; then
    pm2 reload "$APP_DIR/ecosystem.config.cjs" --update-env
    log "API server reloaded"
else
    pm2 start "$APP_DIR/ecosystem.config.cjs"
    log "API server started"
fi

pm2 save
pm2 startup 2>/dev/null || true

# ── 6. Setup Nginx ───────────────────────────────────────────
info "Setup Nginx..."
cp "$ROOT_DIR/deploy/nginx.conf" /etc/nginx/sites-available/streamhub
ln -sf /etc/nginx/sites-available/streamhub /etc/nginx/sites-enabled/streamhub
rm -f /etc/nginx/sites-enabled/default

nginx -t && systemctl reload nginx
log "Nginx configured"

# ── 7. Status ────────────────────────────────────────────────
echo ""
echo -e "${GREEN}============================================================${NC}"
echo -e "${GREEN}  Deploy BERHASIL!${NC}"
echo -e "${GREEN}============================================================${NC}"
echo ""
pm2 list
echo ""
echo "  Frontend: http://$(hostname -I | awk '{print $1}')"
echo "  API:      http://$(hostname -I | awk '{print $1}')/api/health"
echo ""
echo -e "${YELLOW}Langkah selanjutnya:${NC}"
echo "  1. Edit /etc/nginx/sites-available/streamhub"
echo "     → Ubah server_name ke domain kamu"
echo "  2. Install SSL:"
echo "     apt install certbot python3-certbot-nginx"
echo "     certbot --nginx -d domain-kamu.com"
echo "  3. Reload nginx: systemctl reload nginx"
echo ""
