#!/bin/bash
# deploy.sh — Build the studio locally and rsync it to the production server
# Author: Dr Hamid MADANI <drmdh@msn.com>
#
# Reads its configuration from `.env.deploy` (copy `.env.deploy.example` first).
# CLI args override env file values:
#   ./deploy.sh                            # use .env.deploy values
#   ./deploy.sh user@host                  # override DEPLOY_SSH only
#   ./deploy.sh user@host /var/www/foo     # override SSH + remote dir
#
# First deploy : ./install.sh on the server afterwards (vhost + cert).
# Subsequent deploys : ./update.sh on the server (no vhost work).

set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
cd "${SCRIPT_DIR}"

# ── Load .env.deploy ───────────────────────────────────────────────────────
if [ -f .env.deploy ]; then
  set -a; . ./.env.deploy; set +a
elif [ -z "${DEPLOY_SSH:-}" ]; then
  echo "✗ .env.deploy not found. Copy .env.deploy.example to .env.deploy and edit it."
  exit 1
fi

SSH_HOST="${1:-${DEPLOY_SSH}}"
REMOTE_DIR="${2:-${DEPLOY_REMOTE_DIR:-/var/www/media-studio}}"
DOMAIN="${DEPLOY_DOMAIN:-media.example.com}"
PORT="${DEPLOY_PORT:-4499}"

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

echo -e "${CYAN}══════════════════════════════════════════════════${NC}"
echo -e "${CYAN}  media-studio — Deploy → ${SSH_HOST}              ${NC}"
echo -e "${CYAN}  Remote: ${REMOTE_DIR}                            ${NC}"
echo -e "${CYAN}  Domain: ${DOMAIN}                                ${NC}"
echo -e "${CYAN}══════════════════════════════════════════════════${NC}"

# ── 1. Local build ─────────────────────────────────────────────────────────
echo -e "\n${CYAN}[1/6] Local Next.js build...${NC}"
npm run build 2>&1 | tail -5
echo -e "${GREEN}  ✓ Build OK${NC}"

# ── 2. Remote dirs ─────────────────────────────────────────────────────────
echo -e "\n${CYAN}[2/6] Preparing remote directory...${NC}"
ssh "${SSH_HOST}" "mkdir -p ${REMOTE_DIR}/logs ${REMOTE_DIR}/data"

# ── 3. Sync files (flat layout, no /src/) ──────────────────────────────────
echo -e "\n${CYAN}[3/6] Syncing files...${NC}"
rsync -azP --delete \
  --exclude 'node_modules' --exclude '.git' \
  --exclude '.env' --exclude '.env.local' --exclude '.env.deploy' \
  --exclude '.next/cache' \
  --exclude 'data/*.db' --exclude 'data/*.db-*' \
  --exclude 'logs' \
  "${SCRIPT_DIR}/" "${SSH_HOST}:${REMOTE_DIR}/"

# .env on remote = .env.example fallback only on first deploy
NEED_ENV=$(ssh "${SSH_HOST}" "test -f ${REMOTE_DIR}/.env && echo NO || echo YES")
if [ "${NEED_ENV}" = "YES" ] && [ -f .env.example ]; then
  scp .env.example "${SSH_HOST}:${REMOTE_DIR}/.env"
  echo -e "${YELLOW}  .env seeded from .env.example — review on remote${NC}"
fi
echo -e "${GREEN}  ✓ Files synced${NC}"

# ── 4. npm install on remote ───────────────────────────────────────────────
echo -e "\n${CYAN}[4/6] Remote npm install...${NC}"
ssh "${SSH_HOST}" "cd ${REMOTE_DIR} && chmod +x install.sh update.sh && npm install --legacy-peer-deps" 2>&1 | tail -5

# ── 5. PM2 restart ─────────────────────────────────────────────────────────
echo -e "\n${CYAN}[5/6] PM2 restart...${NC}"
ssh "${SSH_HOST}" "cd ${REMOTE_DIR} && pm2 delete media-studio 2>/dev/null; pm2 start ecosystem.config.cjs && pm2 save" 2>&1 | grep -E "online|error|launched" || true

# ── 6. Verify ──────────────────────────────────────────────────────────────
echo -e "\n${CYAN}[6/6] Verify...${NC}"
sleep 4
LOCAL_CODE=$(ssh "${SSH_HOST}" "curl -s -o /dev/null -w '%{http_code}' http://127.0.0.1:${PORT}/" 2>/dev/null || echo "000")
PUBLIC_CODE=$(curl -s -o /dev/null -w '%{http_code}' "https://${DOMAIN}/" --max-time 8 2>/dev/null || echo "000")
echo -e "  Backend (127.0.0.1:${PORT}) : HTTP ${LOCAL_CODE}"
echo -e "  Public  (https://${DOMAIN})  : HTTP ${PUBLIC_CODE}"

if [ "${LOCAL_CODE}" = "200" ] || [ "${LOCAL_CODE}" = "307" ]; then
  echo -e "${GREEN}  ✓ Backend up${NC}"
else
  echo -e "${RED}  ✗ Backend not responding — ssh ${SSH_HOST} 'pm2 logs media-studio'${NC}"
fi

MEDIA_VER=$(ssh "${SSH_HOST}" "cd ${REMOTE_DIR} && node -e \"console.log(require('./node_modules/@mostajs/media/package.json').version)\" 2>/dev/null" || echo "?")

echo -e "\n${GREEN}══════════════════════════════════════════════════${NC}"
echo -e "${GREEN}  Deploy complete — @mostajs/media v${MEDIA_VER}      ${NC}"
echo -e "${GREEN}  Studio : https://${DOMAIN}                        ${NC}"
echo -e "${GREEN}══════════════════════════════════════════════════${NC}"

if [ "${PUBLIC_CODE}" != "200" ] && [ "${PUBLIC_CODE}" != "307" ]; then
  echo ""
  echo -e "${YELLOW}First deploy ? Set up vhost + TLS cert :${NC}"
  echo -e "${YELLOW}  ssh ${SSH_HOST} \"cd ${REMOTE_DIR} && ./install.sh\"${NC}"
  echo -e "${YELLOW}Also confirm DNS : ${DOMAIN} A → your-server-ip (no AAAA)${NC}"
fi
